/ Hex Artifact Content
Login

Artifact 4fe451d68950002eb985e6325d666ab54956a37f:


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: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a  *.** doNotSync.*
35d0: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
35e0: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
35f0: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3600: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
3610: 20 66 69 6c 65 20 63 61 6e 6e 6f 74 0a 2a 2a 20   file cannot.** 
3620: 20 20 62 65 20 73 79 6e 63 65 64 2e 20 20 54 68    be synced.  Th
3630: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
3640: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
3650: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
3660: 69 74 65 28 29 20 0a 2a 2a 20 20 20 69 6e 20 6f  ite() .**   in o
3670: 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
3680: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 66  a journal sync f
3690: 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e  rom happening in
36a0: 20 62 65 74 77 65 65 6e 20 74 68 65 0a 2a 2a 20   between the.** 
36b0: 20 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66    journalling of
36c0: 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74 68   two pages on th
36d0: 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 2a  e same sector..*
36e0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
36f0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
3700: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
3710: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
3720: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
3730: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
3740: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
3750: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
3760: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
3770: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
3780: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
3790: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
37a0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
37b0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
37c0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
37d0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
37e0: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
37f0: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
3800: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
3810: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
3820: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
3830: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
3840: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
3850: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
3860: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
3870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3880: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
3890: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
38a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
38c0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
38d0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
38e0: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
38f0: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3900: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
3910: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
3920: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
3930: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
3940: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
3950: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
3960: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
3970: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
39a0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
39b0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
39c0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
39d0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
39e0: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
39f0: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
3a00: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
3a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3a20: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
3a30: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
3a40: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a60: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
3a70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3a80: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
3a90: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
3aa0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3ab0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
3ac0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
3ad0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
3ae0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3af0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3b00: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3b10: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
3b20: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
3b30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
3b40: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
3b50: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
3b60: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3b80: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
3b90: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
3ba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
3bb0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
3bc0: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
3bd0: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
3be0: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
3bf0: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
3c00: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
3c10: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
3c20: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
3c30: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
3c40: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
3c50: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
3c60: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
3c70: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
3c80: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
3c90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
3ca0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
3cb0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
3cc0: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
3cd0: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
3ce0: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
3cf0: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
3d00: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
3d10: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
3d20: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
3d30: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
3d40: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
3d50: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
3d60: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
3d70: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
3d80: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
3d90: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
3da0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
3db0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
3dc0: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
3dd0: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
3de0: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
3e00: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
3e10: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
3e20: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
3e30: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
3e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e50: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
3e60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
3e70: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
3e80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3e90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
3ea0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
3eb0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
3ec0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
3ed0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
3ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
3ef0: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
3f00: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
3f10: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3f20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3f30: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3f40: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3f50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
3f60: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
3f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f80: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
3f90: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
3fa0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
3fb0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3fd0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3fe0: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3ff0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
4000: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
4010: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
4020: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
4030: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
4040: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
4050: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4060: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
4070: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
4080: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
40b0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
40c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
40d0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
40e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
40f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
4100: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
4110: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4130: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
4140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
4150: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
4160: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
4170: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
4180: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
4190: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
41a0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
41c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
41d0: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
41e0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
41f0: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
4200: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
4210: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
4220: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
4230: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
4240: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
4250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4260: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
4270: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
4280: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
4290: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
42a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
42b0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
42c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
42d0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
42e0: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
42f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4300: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
4310: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
4320: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
4330: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4340: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
4350: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
4360: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
4370: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
4380: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43a0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
43b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
43c0: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
43d0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
43e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
43f0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
4400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4410: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
4420: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
4430: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  ader */.  i64 jo
4440: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
4450: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
4460: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
4470: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
4480: 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70   */.  PagerSavep
4490: 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74  oint *aSavepoint
44a0: 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63  ; /* Array of ac
44b0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f  */.  int nSavepo
44d0: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
44e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
44f0: 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70  ements in aSavep
4500: 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  oint[] */.  char
4510: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
4520: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
4530: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
4540: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
4550: 73 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f  s */.  u32 secto
4560: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
4570: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
4580: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
4590: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
45a0: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
45c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
45d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
45e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
45f0: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4610: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
4620: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
4630: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
4640: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4660: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4670: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4680: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
4690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
46a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
46b0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  n a page */.  Pg
46c0: 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20  no mxPgno;      
46d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
46e0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a  imum allowed siz
46f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4700: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4710: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4720: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4740: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4750: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4760: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4780: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
4790: 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a  dler)(void*); /*
47a0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
47b0: 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20  l when busy */. 
47c0: 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
47d0: 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20  lerArg;      /* 
47e0: 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74  Context argument
47f0: 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65   for xBusyHandle
4800: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
4810: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48  TE_TEST.  int nH
4820: 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20  it, nMiss;      
4830: 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68        /* Cache h
4840: 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20  its and missing 
4850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20  */.  int nRead, 
4860: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
4870: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
4880: 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  es read/written 
4890: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64  */.#endif.  void
48a0: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62   (*xReiniter)(Db
48b0: 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20  Page*); /* Call 
48c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
48d0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
48e0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
48f0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4900: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4910: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4920: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4930: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4940: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4950: 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
4960: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
4970: 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70  ; /* Notify of p
4980: 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73  age size changes
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
49a0: 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b  decFree)(void*);
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49c0: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
49d0: 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f  he codec */.  vo
49e0: 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20  id *pCodec;     
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4a00: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
4a10: 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73  Codec... methods
4a20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4a30: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4a50: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4a60: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4a70: 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68  p use */.  PCach
4a80: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
4a90: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4aa0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
4ab0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
4ac0: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
4ad0: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
4ae0: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
4af0: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
4b00: 63 65 73 73 65 73 20 2a 2f 0a 23 69 66 6e 64 65  cesses */.#ifnde
4b10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
4b20: 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20  L.  Wal *pWal;  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c  /* Write-ahead l
4b50: 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72  og used by "jour
4b60: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f  nal_mode=wal" */
4b70: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
4b80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4b90: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
4ba0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
4bb0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
4bc0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
4bd0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4be0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
4bf0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4c00: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4c10: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4c20: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4c30: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4c40: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4c50: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4c70: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4c80: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4c90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ca0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
4cb0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
4cc0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4cd0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4ce0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4cf0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4d00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4d10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4d20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4d30: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
4d40: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
4d50: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
4d60: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
4d70: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
4d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
4d90: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
4da0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
4db0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
4dc0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
4dd0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
4de0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
4df0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
4e00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
4e10: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
4e20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
4e30: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
4e40: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
4e50: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
4e60: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
4e70: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
4e80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
4e90: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
4ea0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
4eb0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
4ec0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
4ed0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
4ee0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
4ef0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
4f00: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
4f10: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
4f20: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
4f30: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
4f40: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
4f50: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
4f60: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
4f70: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
4f80: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
4f90: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
4fa0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
4fb0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
4fc0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
4fd0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
4fe0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
4ff0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
5000: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
5010: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
5020: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
5030: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
5040: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
5050: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
5060: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
5070: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
5080: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
5090: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
50a0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
50b0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
50c0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
50d0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
50e0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
50f0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
5100: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
5110: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
5120: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
5130: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
5140: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
5150: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
5160: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
5170: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
5180: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
5190: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
51a0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
51b0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
51c0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
51d0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
51e0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
51f0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
5200: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
5210: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
5220: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
5230: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
5240: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
5250: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
5260: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
5270: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
5280: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
5290: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
52a0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
52b0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
52c0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
52d0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
52e0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
52f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
5300: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
5310: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
5320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
5330: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
5340: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
5350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5360: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
5370: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
5380: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
5390: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
53a0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
53b0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
53c0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
53d0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
53e0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
53f0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
5400: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
5410: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5430: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
5440: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
5450: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
5460: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
5470: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
5480: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5490: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
54a0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
54b0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
54c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
54d0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
54e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
54f0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
5500: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
5510: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
5520: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
5530: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
5540: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
5550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5560: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
5570: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
5580: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
5590: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
55a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
55b0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
55c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
55d0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
55e0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
55f0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
5600: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
5610: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
5620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
5630: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
5640: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
5650: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
5660: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
5670: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
5680: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
5690: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
56a0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
56b0: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
56c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
56d0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
56e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
56f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
5700: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
5710: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
5720: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
5730: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
5740: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
5750: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
5760: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
5770: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
5780: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
5790: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
57a0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
57b0: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
57c0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
57d0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
57e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
57f0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
5800: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
5810: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
5820: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
5830: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
5840: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
5850: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
5860: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
5870: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
5880: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
5890: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
58a0: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
58b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
58c0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
58d0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
58e0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
58f0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
5900: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
5910: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
5920: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5930: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
5940: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
5950: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5960: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
5970: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
5980: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
5990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
59a0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
59b0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
59c0: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
59d0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
59e0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
59f0: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
5a00: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
5a10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
5a20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5a30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5a40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
5a50: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
5a60: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
5a70: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
5a80: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
5a90: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
5aa0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5ab0: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
5ac0: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
5ad0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
5ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5af0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5b00: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
5b10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5b20: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
5b30: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
5b40: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
5b50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
5b60: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
5b70: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
5b80: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
5b90: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
5ba0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
5bb0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
5bc0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
5bd0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
5be0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
5bf0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5c00: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5c10: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
5c20: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
5c30: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
5c40: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
5c50: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
5c60: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
5c70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5c80: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
5c90: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
5ca0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5cb0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
5cc0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
5cd0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
5ce0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
5cf0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
5d00: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
5d10: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
5d20: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
5d30: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
5d40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5d50: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
5d60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5d70: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d80: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
5d90: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
5da0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
5db0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
5dc0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
5dd0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
5de0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
5df0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
5e00: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
5e10: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
5e20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e30: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
5e40: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
5e50: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
5e60: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
5e70: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
5e80: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
5e90: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
5ea0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
5eb0: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
5ec0: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
5ed0: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
5ee0: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
5ef0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
5f00: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
5f10: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
5f20: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
5f30: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
5f40: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
5f50: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
5f60: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
5f70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
5f80: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
5f90: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
5fa0: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
5fb0: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
5fc0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
5fd0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
5fe0: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
5ff0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
6000: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
6010: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
6020: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6030: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
6040: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
6050: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
6060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6070: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
6080: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
6090: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
60a0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
60b0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
60c0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
60d0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
60e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
60f0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
6100: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
6110: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
6120: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
6130: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
6140: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
6150: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
6160: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
6170: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
6180: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
6190: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
61a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
61b0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
61c0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
61d0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
61e0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
61f0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
6200: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
6210: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
6220: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
6230: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
6240: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
6250: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
6260: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
6270: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6280: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
6290: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
62a0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
62b0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
62c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
62d0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
62e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
62f0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
6300: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
6310: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
6320: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
6330: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6340: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
6350: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
6360: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
6370: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
6380: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
6390: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
63a0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
63b0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63d0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
63e0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
63f0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
6420: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
6430: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6440: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6450: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
6460: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
6470: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
6480: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
6490: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
64a0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
64b0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
64c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
64d0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
64e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
64f0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
6500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
6510: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
6520: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
6530: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
6540: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
6550: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
6560: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
6570: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
6580: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
6590: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
65a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
65b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
65c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
65d0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
65e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
65f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
6600: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6610: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
6620: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
6630: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
6640: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
6650: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
6660: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
6670: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
6680: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
6690: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
66a0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
66b0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
66c0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
66d0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
66e0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
66f0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
6700: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
6710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6720: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
6730: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
6750: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
6760: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
6770: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
6790: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
67a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
67b0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
67c0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
67d0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
67e0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
67f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
6800: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
6810: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
6820: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
6830: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
6840: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
6850: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
6860: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
6870: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
6880: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
6890: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
68a0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
68b0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
68c0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
68d0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
68e0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
68f0: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
6900: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
6910: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
6920: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
6930: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
6940: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
6950: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
6960: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
6970: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
6980: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
6990: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
69a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
69b0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
69c0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
69d0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
69e0: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
69f0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
6a00: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
6a10: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
6a20: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
6a30: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
6a40: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
6a50: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
6a60: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
6a70: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
6a80: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
6a90: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
6aa0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
6ab0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
6ac0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
6ad0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
6ae0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
6af0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
6b00: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
6b10: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
6b20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6b30: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
6b40: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
6b50: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
6b60: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
6b70: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
6b80: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
6b90: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
6ba0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
6bb0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
6bc0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
6bd0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
6be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6bf0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
6c00: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
6c10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
6c20: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
6c30: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
6c40: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
6c50: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
6c60: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
6c70: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
6c80: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
6c90: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
6ca0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
6cb0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
6cc0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
6cd0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
6ce0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
6cf0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
6d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
6d10: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
6d20: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
6d30: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
6d40: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
6d50: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
6d60: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
6d70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
6d80: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
6d90: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
6da0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
6db0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6dc0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
6dd0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
6de0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
6df0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
6e00: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
6e10: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
6e20: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
6e30: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
6e40: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6e50: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
6e60: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
6e70: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
6e80: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
6e90: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
6ea0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
6eb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6ec0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
6ed0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
6ee0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
6ef0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
6f00: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
6f10: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
6f20: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
6f30: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
6f40: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
6f50: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6f70: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
6f80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
6f90: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
6fa0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
6fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
6fe0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7000: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
7010: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
7020: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
7030: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
7040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
7050: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
7060: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
7070: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
7080: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
7090: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
70a0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
70b0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
70c0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70e0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
70f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
7100: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
7110: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
7120: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7130: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7140: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
7150: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
7160: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
7170: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
7180: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
7190: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
71a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
71b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
71c0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
71d0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
71e0: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
71f0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
7200: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
7210: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
7220: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7240: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
7250: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
7260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
7270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7280: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
7290: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
72a0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
72b0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
72c0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
72d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
72e0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
72f0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
7300: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
7310: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
7320: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
7330: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
7340: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
7350: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
7360: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
7370: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
7380: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
7390: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
73a0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
73b0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
73c0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
73d0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
73e0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
73f0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
7400: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
7410: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
7420: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
7430: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
7440: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
7450: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
7460: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
7470: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
7480: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
7490: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
74a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
74b0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
74c0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
74d0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
74e0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
74f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
7500: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
7510: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
7520: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
7530: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
7540: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
7550: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
7560: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
7570: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
7580: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
7590: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
75a0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
7640: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
7650: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
7660: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
7670: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
7680: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7690: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
76a0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
76b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
76c0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
76d0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
76e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
76f0: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
7700: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7710: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
7720: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
7730: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7740: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
7750: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
7760: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
7770: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
7780: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
7790: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
77a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
77b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
77c0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
77d0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
77e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
77f0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7800: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
7810: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
7820: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
7830: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
7840: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
7850: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
7860: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
7870: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
7880: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
7890: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
78a0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
78b0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
78c0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
78d0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
78e0: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
78f0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
7900: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
7910: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
7920: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
7930: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7940: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
7950: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
7960: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
7970: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
7980: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
7990: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
79a0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
79b0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
79c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
79d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
79e0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
79f0: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
7a00: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
7a10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
7a20: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
7a30: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
7a40: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
7a50: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
7a60: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
7a70: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
7a80: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
7a90: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
7aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
7ab0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
7ac0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
7ad0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
7ae0: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
7af0: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
7b00: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
7b10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
7b20: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
7b30: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
7b40: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
7b50: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
7b60: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
7b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
7b90: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
7ba0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7bb0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
7bc0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7bd0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
7c00: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
7c10: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
7c20: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
7c30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7c40: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
7c50: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
7c60: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
7c70: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
7c80: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
7c90: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
7ca0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
7cb0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
7cc0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
7cd0: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
7ce0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7cf0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7d00: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
7d10: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
7d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
7d30: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
7d40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7d50: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7d60: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
7d70: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
7d80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
7d90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7da0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
7db0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
7dc0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
7dd0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
7de0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
7df0: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
7e00: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
7e10: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
7e20: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
7e30: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
7e40: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
7e50: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
7e60: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
7e70: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
7e80: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
7e90: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
7ea0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
7eb0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
7ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7ed0: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
7ee0: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
7ef0: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
7f00: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
7f10: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
7f20: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
7f30: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
7f40: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
7f50: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
7f60: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
7f70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7f80: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
7f90: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
7fa0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7fb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
7fc0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
7fd0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
7fe0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
7ff0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
8000: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8010: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
8020: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
8030: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8050: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8060: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8070: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
8080: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
8090: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
80a0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
80b0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
80c0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
80d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
80e0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
80f0: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
8100: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
8110: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8120: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
8130: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
8140: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
8150: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
8160: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
8170: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
8180: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
8190: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
81a0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
81b0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
81c0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
81d0: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
81e0: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
81f0: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
8200: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
8210: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
8220: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
8230: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
8240: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
8250: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
8260: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
8270: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
8280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8290: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
82a0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
82b0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
82c0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
82d0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
82e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8300: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
8310: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
8320: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
8330: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
8340: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
8350: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
8360: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
8370: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8380: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
8390: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
83a0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
83b0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
83e0: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
83f0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
8400: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8430: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
8440: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8450: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8460: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8470: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
8480: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
8490: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
84a0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
84b0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
84c0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
84d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
84e0: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
84f0: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
8500: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
8510: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
8520: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
8530: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
8540: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
8550: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
8560: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
8570: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
8580: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
8590: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
85a0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
85b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
85c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
85d0: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
85e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
85f0: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
8600: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
8610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
8620: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
8630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
8640: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8650: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8660: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
8670: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
8680: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
8690: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
86a0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
86b0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
86c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
86d0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
86e0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
86f0: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
8700: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
8710: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
8720: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
8730: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
8750: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
8760: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
8770: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
8780: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
8790: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
87a0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
87b0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
87c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
87d0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
87e0: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
87f0: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
8800: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
8810: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
8820: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
8830: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
8840: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
8850: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
8860: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8870: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
8880: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
8890: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
88a0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
88b0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
88c0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
88d0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
88e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
88f0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
8900: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
8910: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
8920: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
8930: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
8940: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
8950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
8960: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
8970: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
8980: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
8990: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
89a0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
89b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
89c0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
89d0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
89e0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
89f0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
8a00: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
8a10: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
8a20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
8a30: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
8a40: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
8a50: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
8a60: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
8a70: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
8a80: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
8a90: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
8aa0: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
8ab0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
8ac0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
8ad0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
8ae0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
8af0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
8b00: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
8b10: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8b20: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
8b30: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
8b40: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
8b50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8b60: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
8b70: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
8b80: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
8b90: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
8ba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
8bb0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
8bc0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8bd0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
8be0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
8bf0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
8c00: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
8c10: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
8c20: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
8c30: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
8c40: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
8c50: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8c60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8c70: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
8c80: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
8c90: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
8ca0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8cb0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8cc0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8cd0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
8ce0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
8cf0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
8d00: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
8d10: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
8d20: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
8d30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8d40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8d50: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
8d60: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
8d70: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
8d80: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
8d90: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
8db0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
8dc0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
8dd0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
8de0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
8df0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
8e00: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
8e10: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
8e20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8e30: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
8e40: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
8e50: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
8e60: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
8e70: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
8e80: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
8e90: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
8ea0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
8eb0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
8ec0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
8ed0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8ee0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
8ef0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
8f00: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
8f10: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
8f20: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
8f30: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
8f40: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
8f50: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
8f60: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
8f70: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
8f80: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
8f90: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
8fa0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
8fb0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
8fc0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
8fd0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
8fe0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
8ff0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
9000: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
9010: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
9020: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
9030: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
9040: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
9050: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
9060: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
9070: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
9080: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
9090: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
90a0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
90b0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
90c0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
90d0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
90e0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
90f0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
9100: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
9110: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
9120: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
9130: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
9140: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
9150: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
9160: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
9170: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
9180: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
9190: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
91a0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
91b0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
91c0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
91d0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
91e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
91f0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
9200: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
9210: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
9220: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
9230: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
9240: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
9250: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
9260: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
9270: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
9280: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
9290: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
92a0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
92b0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
92c0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
92d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
92e0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
92f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
9300: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
9310: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
9320: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9330: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9340: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
9350: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
9360: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
9380: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
9390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
93a0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
93b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93c0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
93d0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
93e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93f0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
9400: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
9420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9430: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
9440: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
9450: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
9460: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
9470: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
9480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
9490: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
94a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
94b0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
94c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
94d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94e0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
94f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9500: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
9510: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
9520: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
9530: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
9540: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
9550: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
9560: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
9570: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
9580: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
9590: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
95a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
95b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
95c0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
95d0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
95e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
95f0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
9600: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
9610: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
9620: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
9630: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
9640: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
9650: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
9660: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
9670: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
9680: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
9690: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
96a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
96b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
96c0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
96d0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
96e0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
96f0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
9700: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
9710: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
9720: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
9730: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
9740: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
9750: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9760: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
9770: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
9780: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
9790: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
97a0: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
97b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
97c0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
97d0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
97e0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
97f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9800: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
9810: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
9820: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
9830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9840: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
9850: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
9860: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
9870: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
9880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9890: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
98a0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
98b0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
98c0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98e0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
98f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9900: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
9910: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
9920: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
9930: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
9940: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
9950: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9960: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
9970: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
9980: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
9990: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
99a0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
99b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
99c0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
99d0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
99e0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
99f0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
9a00: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
9a10: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9a20: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
9a30: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
9a40: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
9a50: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
9a60: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
9a70: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
9a80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9a90: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
9aa0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
9ab0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
9ac0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
9ad0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
9ae0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
9b10: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
9b20: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
9b30: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
9b40: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
9b50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
9b60: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
9b70: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
9b80: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
9b90: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
9ba0: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
9bb0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
9bc0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
9bd0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
9be0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
9bf0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
9c00: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
9c10: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
9c20: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
9c30: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
9c40: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
9c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
9c60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
9c70: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
9c80: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
9c90: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
9ca0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9cb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
9cc0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
9cd0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
9ce0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
9cf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9d00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
9d10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
9d20: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
9d30: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
9d40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9d50: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
9d60: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
9d70: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
9d80: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
9d90: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
9da0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
9db0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
9dc0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
9dd0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
9de0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
9df0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
9e00: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9e10: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9e20: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
9e30: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e40: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9e50: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9e60: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
9e70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9e80: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e90: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9ea0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9eb0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
9ec0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
9ed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9ee0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
9ef0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
9f00: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
9f10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9f20: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
9f30: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
9f40: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
9f50: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
9f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
9f70: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
9f80: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
9f90: 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50 61 67   */.    u16 iPag
9fa0: 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20 20 20  eSize16;        
9fb0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
9fc0: 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31 36 2d  iPageSize in 16-
9fd0: 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  bit variable */.
9fe0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
9ff0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
a000: 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
a010: 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
a020: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
a030: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
a040: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a050: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
a060: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
a070: 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
a080: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
a090: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a0a0: 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
a0b0: 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
a0c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
a0d0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
a0e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
a0f0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
a100: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
a110: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
a120: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
a130: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
a140: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
a150: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
a160: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
a170: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
a180: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
a190: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
a1a0: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
a1b0: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
a1c0: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
a1d0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
a1e0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
a1f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
a200: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
a210: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
a220: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
a230: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
a240: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a250: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
a260: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
a270: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
a280: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
a290: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
a2a0: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
a2b0: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
a2c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
a2d0: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
a2e0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
a2f0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
a300: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
a310: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
a320: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
a330: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
a340: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
a350: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
a360: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
a370: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
a380: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
a390: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
a3a0: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
a3b0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
a3c0: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
a3d0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a3e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
a3f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
a400: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
a410: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
a420: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
a430: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
a440: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
a450: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
a460: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
a470: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
a480: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
a490: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
a4a0: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
a4b0: 20 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20    iPageSize16 = 
a4c0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a  (u16)iPageSize;.
a4d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a4e0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
a4f0: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
a500: 69 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20  ize16, -1);.    
a510: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
a520: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61  LITE_OK );.    a
a530: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a540: 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a  E_OK || iPageSiz
a550: 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53  e16==(u16)iPageS
a560: 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  ize );..    /* U
a570: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
a580: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
a590: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
a5a0: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
a5b0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a5c0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
a5d0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
a5e0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
a5f0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
a600: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
a610: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
a620: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
a630: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
a640: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
a650: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
a660: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
a670: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
a680: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
a690: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
a6a0: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
a6b0: 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
a6c0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
a6d0: 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
a6e0: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
a6f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a700: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
a710: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
a730: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
a740: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
a750: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
a760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a770: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
a780: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
a790: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
a7a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a7b0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
a7c0: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
a7d0: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
a7e0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
a7f0: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
a800: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
a810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
a820: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
a830: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
a840: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
a850: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
a860: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
a870: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
a880: 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
a890: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
a8a0: 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
a8b0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
a8c0: 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
a8d0: 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
a8e0: 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
a8f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a900: 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
a910: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
a920: 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
a930: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
a940: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
a950: 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
a960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a980: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
a990: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
a9a0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
a9b0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
a9c0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
a9d0: 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
a9e0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
a9f0: 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
aa00: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
aa10: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
aa20: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
aa30: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
aa40: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
aa50: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
aa60: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
aa70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aa80: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
aa90: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
aaa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
aab0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
aac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
aae0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
aaf0: 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
ab20: 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
ab30: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
ab60: 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
ab70: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
ab80: 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
aba0: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
abb0: 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
abc0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
abf0: 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
ac00: 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  */..  if( !zMast
ac10: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
ac20: 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50  tMaster.   || pP
ac30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ac40: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ac50: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
ac60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ac70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac80: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
ac90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
aca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
acb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
acc0: 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
acd0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
ace0: 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  jfd) );.  assert
acf0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ad00: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
ad10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
ad20: 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
ad30: 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
ad40: 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
ad50: 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
ad60: 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
ad70: 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
ad80: 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
ad90: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
ada0: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
adb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
adc0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
add0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
ade0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
adf0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
ae00: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
ae10: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
ae20: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
ae30: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
ae40: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
ae50: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
ae60: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
ae70: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
ae80: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
ae90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
aea0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
aeb0: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
aec0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
aed0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
aee0: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
aef0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
af00: 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
af10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
af20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
af30: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
af40: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
af50: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
af60: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
af70: 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
af80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
af90: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
afa0: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
afb0: 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
afc0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
afd0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
afe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
aff0: 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
b000: 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
b010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
b020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
b030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
b040: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
b050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b060: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b070: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b080: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
b090: 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
b0a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
b0b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
b0c0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
b0d0: 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72  alMagic, 8, iHdr
b0e0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
b0f0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
b100: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
b110: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b120: 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
b130: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
b140: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
b150: 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  oSync;..  /* If 
b160: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b170: 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
b180: 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
b190: 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
b1a0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
b1b0: 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
b1c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
b1d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
b1e0: 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
b1f0: 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
b200: 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
b210: 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
b220: 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
b230: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
b240: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
b250: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
b260: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
b270: 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
b280: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
b290: 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
b2a0: 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
b2b0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
b2c0: 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
b2d0: 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
b2e0: 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
b2f0: 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
b300: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
b310: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
b320: 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
b330: 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
b340: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b350: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
b360: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b370: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
b380: 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
b390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3a0: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
b3b0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
b3c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b3d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3e0: 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
b3f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
b400: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
b410: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
b420: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
b430: 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
b440: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
b450: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
b460: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
b470: 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
b480: 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
b490: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
b4a0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
b4b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
b4c0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
b4d0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4f0: 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
b500: 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
b510: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
b520: 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
b530: 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
b540: 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
b550: 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
b560: 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
b570: 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
b580: 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
b590: 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
b5a0: 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
b5b0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
b5c0: 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
b5d0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b5e0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70  .** Unless the p
b5f0: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b600: 2d 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20  -state, discard 
b610: 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
b620: 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70  ges. If.** the p
b630: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b640: 2d 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69  -state, then thi
b650: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
b660: 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57  p..**.** TODO: W
b670: 68 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65  hy can we not re
b680: 73 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68  set the pager wh
b690: 69 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61  ile in error sta
b6a0: 74 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te?.*/.static vo
b6b0: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
b6c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b6d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b6e0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b6f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  ){.    sqlite3Ba
b700: 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
b710: 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
b720: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
b730: 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
b740: 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65  ache);.    pPage
b750: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
b760: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
b770: 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
b780: 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
b790: 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
b7a0: 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
b7b0: 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
b7c0: 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
b7d0: 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
b7e0: 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
b7f0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
b800: 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
b810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
b820: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
b830: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
b840: 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
b850: 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
b860: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b880: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
b890: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
b8a0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b8b0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
b8c0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b8d0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
b8e0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
b8f0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
b900: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
b910: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
b920: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b930: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
b940: 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
b950: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
b960: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b970: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
b980: 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
b990: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
b9a0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
b9b0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
b9c0: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
b9d0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
b9e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
b9f0: 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
ba00: 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
ba10: 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
ba20: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
ba30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
ba40: 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
ba50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ba60: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
ba70: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
ba80: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
ba90: 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
baa0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
bab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
bac0: 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
bad0: 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
bae0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
baf0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
bb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bb10: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bb20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bb30: 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
bb40: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
bb50: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
bb60: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
bb70: 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
bb80: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
bb90: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
bba0: 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
bbb0: 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
bbc0: 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
bbd0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
bbe0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bbf0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
bc00: 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
bc10: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
bc20: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
bc30: 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
bc40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
bc50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bc60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
bc70: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
bc80: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
bc90: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69  rite-ahead log i
bca0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
bcb0: 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  ual.** rollback 
bcc0: 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69  journal. Otherwi
bcd0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66  se false..*/.#if
bce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bcf0: 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20  _WAL.static int 
bd00: 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65  pagerUseWal(Page
bd10: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
bd20: 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57  turn (pPager->pW
bd30: 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a  al!=0);.}.#else.
bd40: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73  # define pagerUs
bd50: 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  eWal(x) 0.# defi
bd60: 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  ne pagerRollback
bd70: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
bd80: 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  e pagerWalFrames
bd90: 28 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20  (v,w,x,y,z) 0.# 
bda0: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
bdb0: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
bdc0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
bdd0: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
bde0: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
bdf0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
be00: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
be10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
be20: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
be30: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
be40: 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e  e pager.** is in
be50: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
be60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
be70: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
be80: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
be90: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
bea0: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
beb0: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
bec0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
bed0: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
bee0: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
bef0: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
bf00: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
bf10: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
bf20: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
bf30: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
bf40: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
bf50: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
bf60: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
bf70: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
bf80: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
bf90: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
bfa0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
bfb0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
bfc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bfd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
bfe0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
bff0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
c000: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
c010: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
c020: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  */..    /* Alway
c030: 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  s close the jour
c040: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
c050: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
c060: 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a  ase lock..    **
c070: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74   Otherwise, anot
c080: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
c090: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
c0a0: 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20  =delete might.  
c0b0: 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
c0c0: 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e  file out from un
c0d0: 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
c0e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c0f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c100: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c110: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c120: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
c130: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
c140: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  rnal = 0;.    re
c150: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
c160: 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  ts(pPager);..   
c170: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
c180: 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d  is unlocked, som
c190: 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74  ebody else might
c1a0: 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a   change it. The.
c1b0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74      ** values st
c1c0: 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62  ored in Pager.db
c1d0: 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20  Size etc. might 
c1e0: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69  become invalid i
c1f0: 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61  f.    ** this ha
c200: 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20  ppens.  One can 
c210: 61 72 67 75 65 20 74 68 61 74 20 74 68 69 73 20  argue that this 
c220: 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20  doesn't need to 
c230: 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a  be cleared.    *
c240: 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e  * until the chan
c250: 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b  ge-counter check
c260: 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53   fails in PagerS
c270: 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20  haredLock()..   
c280: 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74 68 65   ** Clearing the
c290: 20 70 61 67 65 20 73 69 7a 65 20 63 61 63 68 65   page size cache
c2a0: 20 68 65 72 65 20 69 73 20 62 65 69 6e 67 20 63   here is being c
c2b0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20 20 20  onservative..   
c2c0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
c2d0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
c2e0: 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
c2f0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
c300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
c310: 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
c320: 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
c330: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c340: 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63      rc = osUnloc
c350: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
c360: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
c370: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c380: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c390: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
c3a0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
c3b0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
c3c0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
c3d0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
c3e0: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
c3f0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
c400: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
c410: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
c420: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
c430: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
c440: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
c450: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
c460: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
c470: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
c480: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
c490: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
c4a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
c4b0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
c4c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c4d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
c4e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
c4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c500: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
c510: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
c520: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
c530: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
c540: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c550: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
c560: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  NLOCK;.    pPage
c570: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
c580: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
c590: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
c5a0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
c5b0: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
c5c0: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
c5d0: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
c5e0: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
c5f0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
c600: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c610: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
c620: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
c630: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
c640: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
c650: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
c660: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
c670: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
c680: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
c690: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
c6a0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
c6b0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
c6c0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
c6d0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
c6e0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
c6f0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
c700: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
c710: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
c720: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
c730: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
c740: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
c750: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
c760: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
c770: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
c780: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
c790: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
c7a0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
c7b0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
c7c0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
c7d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c7e0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
c7f0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
c800: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
c810: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
c820: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
c830: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
c840: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c850: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
c860: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c870: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
c880: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
c890: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
c8a0: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
c8b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
c8c0: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
c8d0: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
c8e0: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
c8f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c900: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
c910: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
c920: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
c930: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
c940: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
c950: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
c960: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
c970: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c980: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
c990: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
c9a0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c9b0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
c9c0: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
c9d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
c9e0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
c9f0: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
ca00: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
ca10: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
ca20: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
ca30: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
ca40: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
ca50: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
ca60: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
ca70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ca80: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
ca90: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
caa0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
cab0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
cac0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
cad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cae0: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
caf0: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
cb00: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
cb10: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
cb20: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
cb30: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
cb40: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
cb50: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
cb60: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
cb70: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
cb80: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
cb90: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
cba0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
cbb0: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
cbc0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
cbd0: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
cbe0: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
cbf0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
cc00: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
cc10: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
cc20: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
cc30: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
cc40: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
cc50: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
cc60: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
cc70: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
cc80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cc90: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
cca0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
ccb0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
ccc0: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
ccd0: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
cce0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ccf0: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
cd00: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
cd10: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
cd20: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
cd30: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
cd40: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
cd50: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
cd60: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
cd70: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
cd80: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
cd90: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
cda0: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
cdb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
cdc0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cdd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
cde0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
cdf0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
ce00: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
ce10: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ce20: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
ce30: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
ce40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ce50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ce60: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
ce70: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
ce80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ce90: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
cea0: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
ceb0: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
cec0: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
ced0: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
cee0: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
cef0: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
cf00: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
cf10: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
cf20: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
cf30: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
cf40: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
cf50: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
cf60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
cf70: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
cf80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
cf90: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
cfa0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
cfb0: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
cfc0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
cfd0: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
cfe0: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
cff0: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
d000: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
d010: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
d020: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
d030: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
d040: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
d050: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
d060: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
d070: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d080: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
d090: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
d0a0: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
d0b0: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
d0c0: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
d0d0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
d0e0: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
d0f0: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
d100: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
d110: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
d120: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
d130: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
d140: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
d150: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d160: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
d170: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
d180: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
d190: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
d1a0: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
d1b0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d1c0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
d1d0: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
d1e0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
d1f0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
d200: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
d210: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
d220: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
d230: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d240: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d250: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
d260: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
d270: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
d280: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
d290: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d2a0: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
d2b0: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
d2c0: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
d2d0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
d2e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
d2f0: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
d300: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
d310: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
d320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
d330: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
d340: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
d350: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
d360: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d370: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
d380: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
d390: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
d3a0: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
d3b0: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
d3c0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
d3d0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d3e0: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
d3f0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d400: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
d410: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
d420: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
d430: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
d440: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d450: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d460: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
d470: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
d480: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
d490: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
d4a0: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
d4b0: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
d4c0: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
d4d0: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
d4e0: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
d4f0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
d500: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
d510: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
d520: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
d530: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
d540: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
d550: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
d560: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
d570: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
d580: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
d590: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
d5a0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
d5b0: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
d5c0: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
d5d0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
d5e0: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
d5f0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
d600: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
d610: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d620: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
d630: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
d640: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
d650: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
d660: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
d670: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
d680: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
d690: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
d6a0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
d6b0: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
d6c0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
d6d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
d6e0: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
d6f0: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
d700: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
d710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d720: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
d730: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
d740: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
d750: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
d760: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
d770: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
d780: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
d790: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
d7a0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
d7b0: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
d7c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
d7d0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
d7e0: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
d7f0: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
d800: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
d810: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
d820: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
d830: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
d840: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
d850: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
d860: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
d870: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
d880: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
d890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d8a0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
d8b0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
d8c0: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
d8d0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
d8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d8f0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d900: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
d910: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
d920: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
d930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d940: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d950: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
d960: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
d970: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
d980: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
d990: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
d9a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d9b0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
d9c0: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
d9d0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
d9e0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
d9f0: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
da00: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
da10: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
da20: 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
da30: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
da40: 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
da50: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
da60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
da70: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
da80: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
da90: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
daa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dab0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
dac0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
dad0: 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
dae0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
daf0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
db00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
db20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
db30: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
db40: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
db50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
db60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
db70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
db80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
dba0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
dbb0: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
dbc0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dbd0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dbe0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dbf0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dc00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
dc10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
dc20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
dc30: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
dc40: 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
dc50: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
dc60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc70: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
dc80: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
dc90: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
dca0: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
dcb0: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
dcc0: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
dcd0: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
dce0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dcf0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dd00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dd10: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dd20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dd30: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
dd40: 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
dd50: 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
dd60: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
dd70: 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
dd80: 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
dd90: 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
dda0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
ddb0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
ddc0: 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
ddd0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
dde0: 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
ddf0: 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
de00: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
de10: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
de20: 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
de30: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
de40: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a  ournal. .      *
de50: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
de60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
de70: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
de80: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
de90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
dea0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
deb0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
dec0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
ded0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
dee0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
def0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
df00: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
df10: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
df20: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
df30: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
df40: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
df50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
df60: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
df70: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
df80: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
df90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
dfb0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
dfc0: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
dfd0: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
dfe0: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
dff0: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
e000: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
e010: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
e020: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
e030: 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
e040: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
e050: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
e060: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
e070: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
e080: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
e090: 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
e0a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e0b0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
e0c0: 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
e0d0: 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
e0e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e0f0: 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
e100: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
e110: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
e120: 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  D;..    /* If th
e130: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
e140: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
e150: 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
e160: 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
e170: 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70 20 74 68  ,.    ** drop th
e180: 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
e190: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
e1a0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
e1b0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
e1c0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
e1d0: 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
e1e0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
e1f0: 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 20 29 7b  ger->pWal, 0) ){
e200: 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6f 73 55  .      rc2 = osU
e210: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
e220: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
e230: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
e240: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
e250: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
e260: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
e270: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
e280: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
e290: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
e2a0: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70  ER_SHARED;.    p
e2b0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
e2c0: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  ntDone = 0;.  }e
e2d0: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
e2e0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
e2f0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
e300: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
e310: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
e320: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
e330: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
e340: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
e350: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
e360: 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ified = 0;..  /*
e370: 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f   TODO: Is this o
e380: 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74  ptimal? Why is t
e390: 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c  he db size inval
e3a0: 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a  idated here .  *
e3b0: 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  * when the datab
e3c0: 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
e3d0: 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70  unlocked? */.  p
e3e0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
e3f0: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
e400: 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
e410: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
e420: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
e430: 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
e440: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
e450: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
e460: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
e470: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
e480: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  c);.}../*.** Par
e490: 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
e4a0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
e4b0: 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
e4c0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
e4d0: 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
e4e0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
e4f0: 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
e500: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
e510: 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
e520: 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
e530: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
e540: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e550: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
e560: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
e570: 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
e580: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
e590: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
e5a0: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
e5b0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
e5c0: 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
e5d0: 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
e5e0: 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
e5f0: 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
e600: 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
e610: 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
e620: 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
e630: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
e640: 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
e650: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
e660: 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
e670: 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
e680: 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
e690: 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
e6a0: 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
e6b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
e6c0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
e6d0: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
e6e0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
e6f0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
e700: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
e710: 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
e720: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
e730: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
e740: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
e750: 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
e760: 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
e770: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
e780: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
e790: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
e7a0: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
e7b0: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
e7c0: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
e7d0: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
e7e0: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
e7f0: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
e800: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
e810: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
e820: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
e830: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
e840: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
e850: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
e860: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
e870: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
e880: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
e890: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
e8a0: 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
e8b0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
e8c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e8d0: 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
e8e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e8f0: 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
e900: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
e910: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
e920: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
e930: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
e940: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
e950: 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
e960: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
e970: 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
e980: 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
e990: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
e9a0: 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
e9b0: 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
e9c0: 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
e9d0: 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
e9e0: 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
e9f0: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
ea00: 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
ea10: 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
ea20: 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
ea30: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
ea40: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
ea50: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d  l..**.** The isM
ea60: 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20  ainJrnl flag is 
ea70: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
ea80: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
ea90: 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a  k journal and.**
eaa0: 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73   false for the s
eab0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
eac0: 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  .  The main roll
ead0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
eae0: 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d  s.** checksums -
eaf0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
eb00: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e  ournal does not.
eb10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
eb20: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
eb30: 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
eb40: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
eb50: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
eb60: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
eb70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
eb80: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
eb90: 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
eba0: 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
ebb0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
ebc0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
ebd0: 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
ebe0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
ebf0: 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
ec00: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
ec10: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
ec20: 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
ec30: 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
ec40: 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
ec50: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
ec60: 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
ec70: 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
ec80: 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
ec90: 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
eca0: 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
ecb0: 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
ecc0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ecd0: 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
ece0: 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
ecf0: 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
ed00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
ed10: 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
ed20: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
ed30: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
ed40: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
ed50: 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
ed60: 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
ed70: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
ed80: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
ed90: 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
eda0: 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
edb0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
edc0: 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
edd0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
ede0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
edf0: 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
ee00: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
ee10: 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
ee20: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
ee30: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
ee40: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
ee50: 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
ee60: 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
ee70: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
ee80: 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
ee90: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
eea0: 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
eeb0: 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
eec0: 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
eed0: 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
eee0: 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
eef0: 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
ef00: 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
ef10: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
ef20: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
ef30: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
ef40: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
ef50: 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
ef60: 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
ef70: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
ef80: 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
ef90: 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
efa0: 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
efb0: 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
efc0: 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
efd0: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
efe0: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
eff0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
f000: 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
f010: 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
f020: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
f030: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
f040: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
f050: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
f060: 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
f070: 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
f080: 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
f090: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f0a0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
f0b0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
f0c0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0e0: 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
f0f0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
f100: 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f120: 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
f130: 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
f140: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
f150: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f160: 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
f170: 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
f180: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
f190: 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
f1b0: 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
f1c0: 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
f1d0: 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
f1e0: 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
f1f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
f200: 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
f210: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
f220: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
f230: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
f240: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
f250: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
f260: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
f270: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
f280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f290: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
f2a0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
f2b0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
f2c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
f2d0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
f2e0: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
f2f0: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
f300: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f320: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
f330: 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
f340: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
f350: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
f360: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
f370: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
f380: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f390: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
f3a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
f3b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
f3c0: 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
f3d0: 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
f3e0: 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
f3f0: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
f400: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
f410: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
f420: 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
f430: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
f440: 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
f450: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
f460: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
f470: 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
f480: 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
f490: 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
f4a0: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
f4b0: 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
f4c0: 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
f4d0: 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
f4e0: 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
f4f0: 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
f500: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
f510: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
f520: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
f530: 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
f540: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f550: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
f560: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
f570: 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
f580: 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
f590: 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
f5a0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
f5b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
f5c0: 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
f5d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
f5e0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
f5f0: 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
f600: 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
f610: 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
f620: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
f630: 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
f640: 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
f650: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
f660: 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
f670: 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
f680: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
f690: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f6a0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
f6b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f6c0: 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
f6d0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
f6e0: 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
f6f0: 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
f700: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
f710: 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
f720: 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
f730: 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
f740: 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
f750: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
f760: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
f770: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
f780: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
f790: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
f7a0: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
f7b0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
f7c0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
f7d0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
f7e0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
f7f0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
f800: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
f810: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
f820: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
f830: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
f840: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
f850: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
f860: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
f870: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
f880: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
f890: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
f8a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
f8b0: 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
f8c0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
f8d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f8e0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
f8f0: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
f900: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
f910: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
f920: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
f930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f940: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f950: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
f960: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
f970: 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
f980: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
f990: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f9a0: 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
f9b0: 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
f9c0: 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
f9d0: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
f9e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f9f0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fa00: 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
fa10: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
fa20: 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
fa30: 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
fa40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fa50: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
fa60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
fa70: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
fa80: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
fa90: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
faa0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
fab0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
fac0: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
fad0: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
fae0: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
faf0: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
fb00: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
fb10: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
fb20: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
fb30: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
fb40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fb50: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
fb60: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
fb70: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
fb80: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
fb90: 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
fba0: 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
fbb0: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
fbc0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
fbd0: 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
fbe0: 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
fbf0: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
fc00: 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
fc10: 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
fc20: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
fc30: 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
fc40: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
fc50: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
fc60: 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
fc70: 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
fc80: 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
fc90: 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
fca0: 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
fcb0: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
fcc0: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
fcd0: 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
fce0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
fcf0: 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
fd00: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
fd10: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
fd20: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
fd30: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
fd40: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
fd50: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
fd60: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
fd70: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
fd80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
fd90: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
fda0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
fdb0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
fdc0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
fdd0: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
fde0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
fdf0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
fe00: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
fe10: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
fe20: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
fe30: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
fe40: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
fe50: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
fe60: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
fe70: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
fe80: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
fe90: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
fea0: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
feb0: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
fec0: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
fed0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
fee0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
fef0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
ff00: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
ff10: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
ff20: 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
ff30: 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
ff40: 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
ff50: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
ff60: 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
ff70: 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
ff80: 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
ff90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
ffa0: 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
ffb0: 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
ffc0: 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
ffd0: 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
ffe0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
fff0: 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
10000 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
10010 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
10020 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
10030 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
10040 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
10050 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
10060 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
10070 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
10080 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
10090 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
100a0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
100b0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
100c0 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
100d0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
100e0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
100f0 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
10100 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
10110 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
10120 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
10130 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
10140 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
10150 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
10160 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
10170 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
10180 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
10190 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
101a0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
101b0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
101c0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
101d0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
101e0 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
101f0 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
10200 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
10210 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
10220 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
10230 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
10240 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
10250 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
10260 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
10270 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  DB );.  PAGERTRA
10280 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
10290 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
102a0 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
102b0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
102c0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
102d0 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
102e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
102f0 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20  8*)aData),.     
10300 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
10310 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
10320 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
10330 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61    ));.  if( isMa
10340 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73  inJrnl ){.    is
10350 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
10360 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66  >noSync || (*pOf
10370 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e  fset <= pPager->
10380 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
10390 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63  else{.    isSync
103a0 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20  ed = (pPg==0 || 
103b0 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  0==(pPg->flags &
103c0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
103d0 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ));.  }.  if( (p
103e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
103f0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
10400 20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67    && isOpen(pPag
10410 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 69 73  er->fd).   && is
10420 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
10430 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
10440 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
10450 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
10460 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
10470 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
10480 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
10490 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
104a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
104b0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
104c0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
104d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
104e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
104f0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
10500 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
10510 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
10520 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
10530 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10540 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
10550 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
10560 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
10570 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
10580 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
10590 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
105a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
105b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
105c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
105d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
105e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
105f0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
10600 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
10610 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
10620 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
10630 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
10640 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
10650 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
10660 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
10670 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
10680 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
10690 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
106a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
106b0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
106c0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
106d0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
106e0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
106f0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
10700 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
10710 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
10720 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
10730 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
10740 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
10750 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
10760 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
10770 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
10780 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
10790 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
107a0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
107b0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
107c0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
107d0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
107e0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
107f0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
10800 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
10810 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
10820 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
10830 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
10840 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
10850 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
10860 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
10870 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
10880 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
10890 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
108a0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
108b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
108c0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
108d0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
108e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
108f0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
10900 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
10910 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
10920 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
10930 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
10940 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
10950 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
10960 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
10970 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
10980 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
10990 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
109a0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
109b0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
109c0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
109d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20  epnt );.    if( 
109e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
109f0 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
10a00 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
10a10 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
10a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10a30 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
10a40 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
10a50 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
10a60 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
10a70 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
10a80 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
10a90 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
10aa0 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
10ab0 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
10ac0 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
10ad0 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
10ae0 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
10af0 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
10b00 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
10b10 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
10b20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
10b30 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
10b40 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
10b50 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
10b60 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
10b70 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
10b80 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
10b90 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
10ba0 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
10bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
10bc0 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
10bd0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
10be0 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
10bf0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
10c00 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
10c10 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10c20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
10c30 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
10c40 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73  pPg);.    if( is
10c50 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
10c60 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66  Savepnt || *pOff
10c70 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  set<=pPager->jou
10c80 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
10c90 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
10ca0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
10cb0 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
10cc0 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
10cd0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
10ce0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
10cf0 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
10d00 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
10d10 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
10d20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
10d30 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
10d40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
10d50 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
10d60 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
10d70 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
10d80 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
10d90 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
10da0 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ut to the.      
10db0 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
10dc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
10dd0 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
10de0 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
10df0 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
10e00 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
10e10 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
10e20 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
10e30 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
10e40 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
10e50 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
10e60 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
10e70 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
10e80 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
10e90 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
10ea0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
10eb0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
10ec0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
10ed0 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
10ee0 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
10ef0 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
10f00 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
10f10 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
10f20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
10f30 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
10f40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10f50 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
10f60 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
10f70 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
10f80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
10f90 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
10fa0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
10fb0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
10fc0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
10fd0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
10fe0 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
10ff0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
11000 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
11010 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
11020 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
11030 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
11040 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
11050 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
11060 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
11070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
11080 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
11090 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
110a0 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
110b0 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
110c0 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
110d0 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
110e0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
110f0 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
11100 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
11110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11120 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
11130 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r) );.      sqli
11140 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
11150 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
11160 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
11170 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
11180 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
11190 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
111a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
111b0 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
111c0 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
111d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
111e0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
111f0 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
11200 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
11210 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
11220 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
11230 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
11240 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
11250 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
11260 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
11270 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
11280 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
11290 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
112a0 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
112b0 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
112c0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
112d0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
112e0 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
112f0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
11300 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
11310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11320 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
11330 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
11340 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
11350 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
11360 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
11370 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
11380 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
11390 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
113a0 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
113b0 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
113c0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
113d0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
113e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
113f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11400 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
11410 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
11420 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
11430 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
11440 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
11450 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
11460 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
11470 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
11480 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
11490 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
114a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
114b0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
114c0 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
114d0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
114e0 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
114f0 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
11500 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
11510 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
11520 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
11530 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
11540 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
11550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
11560 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
11570 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
11580 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
11590 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
115a0 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
115b0 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
115c0 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
115d0 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
115e0 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
115f0 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
11600 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
11610 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
11620 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
11630 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
11640 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11650 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
11660 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
11670 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
11680 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
11690 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
116a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
116b0 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
116c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
116d0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
116e0 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
116f0 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
11700 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
11710 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
11720 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
11730 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
11740 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
11750 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
11760 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
11770 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
11780 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
11790 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
117a0 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
117b0 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
117c0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
117d0 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
117e0 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
117f0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
11800 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
11810 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
11820 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
11830 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11840 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
11850 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
11860 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
11870 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
11880 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
11890 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
118a0 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
118b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
118c0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
118d0 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
118e0 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
118f0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
11900 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
11910 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
11920 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
11930 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
11940 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
11950 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
11960 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
11970 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
11980 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
11990 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
119a0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
119b0 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
119c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
119d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
119e0 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
119f0 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
11a00 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
11a10 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
11a20 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11a30 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
11a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
11a50 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
11a60 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
11a70 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
11a80 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
11a90 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
11aa0 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
11ab0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
11ac0 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
11ad0 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
11ae0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
11af0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
11b00 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
11b10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11b30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
11b50 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
11b60 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
11b70 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
11b80 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
11b90 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
11ba0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
11bb0 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
11bc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
11bd0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
11be0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
11bf0 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
11c00 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11c10 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
11c20 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
11c30 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
11c40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
11c50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11c60 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
11c70 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
11c80 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
11c90 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
11ca0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
11cb0 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
11cc0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
11cd0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
11ce0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
11cf0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
11d00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
11d10 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
11d20 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
11d30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
11d40 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
11d50 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
11d60 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
11d70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11d80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
11d90 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
11da0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
11db0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
11dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
11dd0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
11de0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
11df0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
11e00 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
11e10 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
11e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11e30 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
11e40 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ut;..  rc = sqli
11e50 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
11e60 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
11e70 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
11e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11e90 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11ea0 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
11eb0 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
11ec0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
11ed0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
11ee0 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  terPtr = 0;.    
11ef0 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  int nMasterPtr =
11f00 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
11f10 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  e+1;..    /* Loa
11f20 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
11f30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11f40 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
11f50 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
11f60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
11f70 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
11f80 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
11f90 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
11fa0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
11fb0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28   sqlite3Malloc((
11fc0 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
11fd0 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
11fe0 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  + 1);.    if( !z
11ff0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12000 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
12010 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
12020 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12030 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ut;.    }.    zM
12040 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
12050 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
12060 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
12070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12080 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
12090 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
120a0 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
120b0 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l, 0);.    if( r
120c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
120d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
120e0 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  t;.    zMasterJo
120f0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
12100 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  rnal] = 0;..    
12110 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
12120 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
12130 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
12140 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
12150 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
12160 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73  {.      int exis
12170 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ts;.      rc = s
12180 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
12190 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
121a0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
121b0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
121c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
121d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
121e0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
121f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
12200 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
12210 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
12220 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
12230 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
12240 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12250 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
12260 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
12270 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
12280 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
12290 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
122a0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
122b0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
122c0 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
122d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
122e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
122f0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
12300 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
12310 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
12320 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
12330 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
12340 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12350 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
12360 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
12370 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
12380 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
123a0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
123b0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
123c0 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
123d0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
123e0 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
123f0 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
12400 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
12410 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
12420 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
12430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
12450 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
12470 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
12480 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
12490 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
124a0 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
124b0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
124c0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
124d0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
124e0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
124f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12500 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
12510 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12520 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
12530 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
12540 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
12550 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
12560 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
12570 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
12580 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
12590 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
125a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
125b0 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
125c0 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
125d0 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
125e0 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
125f0 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
12600 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12610 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
12620 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
12630 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d  pJournal) );.  }
12640 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12650 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
12660 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
12670 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12680 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
12690 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
126a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
126b0 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
126c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
126d0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
126e0 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
126f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
12700 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
12710 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
12720 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
12730 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
12740 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
12750 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12760 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
12770 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75  pen, or an exclu
12780 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  sive lock is not
12790 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66  .** held, this f
127a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
127b0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
127c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
127d0 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65  ile is.** change
127e0 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
127f0 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
12800 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
12810 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   If the file.** 
12820 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
12830 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
12840 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
12850 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
12860 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
12870 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
12880 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
12890 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
128a0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
128b0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
128c0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
128d0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
128e0 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
128f0 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
12900 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
12910 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
12920 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
12930 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
12940 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
12950 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
12960 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
12970 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
12980 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
12990 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
129a0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
129b0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
129c0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
129d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
129e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
129f0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
12a00 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
12a10 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
12a20 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
12a30 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
12a40 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
12a50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12a60 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
12a70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
12a80 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
12a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12aa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
12ab0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
12ac0 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70  SIVE && isOpen(p
12ad0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
12ae0 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
12af0 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
12b00 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
12b10 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
12b20 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
12b30 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
12b40 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
12b50 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
12b60 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
12b70 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ewSize = pPager-
12b80 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
12b90 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
12ba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
12bb0 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
12bc0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
12bd0 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
12be0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
12bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
12c00 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
12c10 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
12c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12c40 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
12c50 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65  , "", 1, newSize
12c60 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
12c70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12c90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
12ca0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
12cb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12cd0 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
12ce0 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73  e of the Pager.s
12cf0 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
12d00 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  le for the given
12d10 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20  .** pager based 
12d20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  on the value ret
12d30 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
12d40 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a  ctorSize method.
12d50 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64  ** of the open d
12d60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
12d70 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
12d80 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20  ll be used used 
12d90 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
12da0 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
12db0 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
12dc0 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
12dd0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
12de0 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
12df0 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
12e00 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
12e10 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
12e20 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
12e30 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
12e40 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
12e50 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
12e60 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
12e70 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
12e80 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
12e90 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
12ea0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
12eb0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
12ec0 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
12ed0 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
12ee0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
12ef0 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
12f00 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
12f10 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
12f20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
12f30 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
12f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12f50 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
12f60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12f70 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
12f80 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
12f90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12fa0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
12fb0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
12fc0 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
12fd0 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
12fe0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
12ff0 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
13000 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
13010 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
13020 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
13030 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
13040 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
13050 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
13060 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
13070 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
13080 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
13090 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
130a0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
130b0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
130c0 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50  ize<32 ){.    pP
130d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
130e0 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66   = 512;.  }.  if
130f0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
13100 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
13110 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
13120 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
13130 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
13140 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
13150 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ze = MAX_SECTOR_
13160 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  SIZE;.  }.}../*.
13170 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
13180 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
13190 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
131a0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
131b0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
131c0 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
131d0 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
131e0 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
131f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13200 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
13210 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
13220 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
13230 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
13240 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
13250 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
13260 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
13270 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
13280 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
13290 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
132a0 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
132b0 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
132c0 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
132d0 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
132e0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
132f0 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
13300 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
13310 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
13320 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
13330 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
13340 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
13350 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
13360 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
13370 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
13380 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
13390 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
133a0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
133b0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
133c0 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
133d0 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
133e0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
133f0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
13400 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13410 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
13420 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
13430 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
13440 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
13450 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
13460 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
13470 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
13480 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
13490 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
134a0 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
134b0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
134c0 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
134d0 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
134e0 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
134f0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
13500 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
13510 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
13520 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
13530 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
13540 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
13550 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
13560 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
13570 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
13580 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
13590 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
135a0 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
135b0 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
135c0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
135d0 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
135e0 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
135f0 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
13600 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
13610 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
13620 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
13630 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
13640 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
13650 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13660 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
13670 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
13680 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
13690 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
136a0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
136b0 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
136c0 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
136d0 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
136e0 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
136f0 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
13700 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
13710 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
13720 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
13730 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
13740 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
13750 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
13760 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
13770 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
13780 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
13790 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
137a0 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
137b0 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
137c0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
137d0 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
137e0 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
137f0 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
13800 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
13810 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
13820 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
13830 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
13840 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
13850 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
13860 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
13870 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
13880 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
13890 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
138a0 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
138b0 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
138c0 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
138d0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
138e0 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
138f0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
13900 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
13910 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
13920 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
13930 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
13940 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
13950 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
13960 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
13970 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
13980 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
13990 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
139a0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
139b0 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
139c0 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
139d0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
139e0 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
139f0 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
13a00 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
13a10 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
13a20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
13a30 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
13a40 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
13a50 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
13a60 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
13a70 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
13a80 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
13a90 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
13aa0 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
13ab0 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
13ac0 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
13ad0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
13ae0 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
13af0 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
13b00 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
13b10 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13b20 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
13b30 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
13b40 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
13b50 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
13b60 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
13b70 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
13b80 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
13b90 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
13ba0 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
13bb0 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
13bc0 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
13bd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
13be0 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
13bf0 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
13c00 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
13c10 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
13c20 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
13c30 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
13c40 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
13c50 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
13c60 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
13c70 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
13c80 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
13c90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13ca0 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
13cb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13cc0 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
13cd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
13ce0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
13cf0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
13d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
13d10 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
13d20 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
13d30 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d50 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
13d60 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
13d70 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
13da0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
13db0 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
13dc0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13dd0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
13de0 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
13df0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
13e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13e10 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
13e20 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13e30 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
13e40 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
13e50 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
13e60 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
13e70 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
13e80 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
13e90 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
13ea0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
13eb0 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
13ec0 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
13ed0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
13ee0 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
13ef0 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
13f00 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ack */..  /* Fig
13f10 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
13f20 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
13f30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
13f40 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
13f50 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
13f60 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
13f70 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
13f80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
13f90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
13fa0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
13fb0 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
13fc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
13fd0 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
13fe0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
13ff0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
14000 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
14010 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
14020 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
14030 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
14040 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
14050 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
14060 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
14070 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
14080 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
14090 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
140a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
140b0 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
140c0 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
140d0 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
140e0 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
140f0 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
14100 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
14110 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
14120 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
14130 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
14140 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
14150 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
14160 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
14170 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
14180 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
14190 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
141a0 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
141b0 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
141c0 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
141d0 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
141e0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
141f0 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
14200 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
14210 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
14220 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
14230 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
14240 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
14250 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
14260 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
14270 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
14280 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
14290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
142a0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
142b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
142c0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
142d0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
142e0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
142f0 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
14300 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
14310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
14320 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
14330 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
14340 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
14350 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
14360 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
14370 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
14380 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
14390 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
143a0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
143b0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
143c0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
143d0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
143e0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
143f0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
14400 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
14410 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
14420 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
14430 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
14440 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14450 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
14460 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
14470 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
14480 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
14490 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
144a0 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
144b0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
144c0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
144d0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
144e0 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
144f0 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
14500 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
14510 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
14520 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
14530 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
14540 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
14550 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
14560 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
14570 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
14580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
14590 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
145a0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
145b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
145c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
145d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
145e0 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
145f0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
14600 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
14610 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
14620 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
14630 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
14640 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
14650 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
14660 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
14670 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
14680 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
14690 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
146a0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
146b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
146c0 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
146d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
146e0 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
146f0 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
14700 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
14710 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
14720 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14730 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
14740 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
14750 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
14760 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
14770 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
14780 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
14790 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
147a0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
147b0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
147c0 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
147d0 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
147e0 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
147f0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
14800 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
14810 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
14820 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
14830 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
14840 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
14850 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
14860 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
14870 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
14880 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
14890 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
148a0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
148b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
148c0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
148d0 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
148e0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
148f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
14900 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
14910 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
14920 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
14930 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
14940 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
14950 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
14960 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
14970 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14980 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
14990 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
149a0 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
149b0 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
149c0 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
149d0 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
149e0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
149f0 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
14a00 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
14a10 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
14a20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
14a30 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
14a40 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
14a50 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
14a60 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
14a70 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
14a80 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
14a90 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
14aa0 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
14ab0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
14ac0 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
14ad0 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
14ae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
14af0 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
14b00 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14b10 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
14b20 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14b30 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
14b40 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
14b50 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
14b60 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
14b70 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
14b80 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
14b90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14ba0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
14bb0 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
14bc0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14bd0 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
14be0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
14bf0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
14c00 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
14c10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14c20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14c30 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
14c40 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
14c50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
14c60 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
14c70 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
14c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14c90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
14ca0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
14cb0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
14cc0 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
14cd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
14ce0 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
14cf0 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
14d00 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
14d10 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
14d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14d30 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
14d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
14d50 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
14d60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
14d70 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
14d80 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
14d90 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
14da0 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
14db0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
14dc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14dd0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
14de0 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
14df0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
14e00 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
14e10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14e30 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
14e40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14e50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14e60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
14e70 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
14e80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14e90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
14ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
14eb0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
14ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
14ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
14ee0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
14ef0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
14f00 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
14f10 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
14f20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
14f30 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
14f40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
14f50 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
14f60 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
14f70 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
14f80 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
14f90 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
14fa0 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
14fb0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
14fc0 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
14fd0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
14fe0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
14ff0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
15000 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
15010 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
15020 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
15030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15040 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
15050 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
15060 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
15080 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
15090 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
150a0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
150b0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
150c0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
150d0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
150e0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
150f0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
15100 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
15110 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
15120 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
15130 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
15140 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
15150 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
15160 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
15170 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
15180 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
15190 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
151a0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
151b0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
151c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
151d0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
151e0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
151f0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
15200 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
15210 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
15220 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
15230 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
15240 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
15250 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
15260 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15270 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
15280 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
15290 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
152a0 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
152b0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
152c0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
152d0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
152e0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
152f0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
15300 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
15310 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
15320 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
15330 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
15340 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
15350 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
15360 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
15370 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
15380 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
15390 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
153a0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
153b0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
153c0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
153d0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
153e0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
153f0 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
15400 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
15410 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
15420 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
15430 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
15440 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
15450 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
15460 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
15470 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
15480 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
15490 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
154a0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
154b0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
154c0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
154d0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
154e0 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
154f0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
15500 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
15510 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
15520 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
15530 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
15540 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
15550 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
15560 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
15570 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
15580 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
15590 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
155a0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
155b0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
155c0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
155d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
155e0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
155f0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
15600 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
15610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15620 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
15630 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
15640 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
15650 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
15660 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
15670 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
15680 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
15690 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
156a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
156b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
156c0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f  OK && pPager->no
156d0 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
156e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
156f0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
15700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
15710 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
15720 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
15730 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  gs);.  }.  if( r
15740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15750 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
15760 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  0 && pPager->sta
15770 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
15780 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
15790 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
157a0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
157b0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
157c0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
157d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
157e0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
157f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
15800 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
15810 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
15820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15830 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
15840 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
15850 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
15860 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
15870 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
15880 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
15890 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
158a0 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
158b0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
158c0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
158d0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
158e0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
158f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
15900 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
15910 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
15920 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
15930 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
15940 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
15950 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
15960 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
15970 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
15980 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
15990 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
159a0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
159b0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
159c0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
159d0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
159e0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
159f0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
15a00 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
15a10 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
15a20 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
15a30 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
15a40 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
15a50 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
15a60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15a70 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
15a80 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
15a90 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
15aa0 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
15ab0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
15ac0 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
15ad0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
15ae0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
15af0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
15b00 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
15b10 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
15b20 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
15b30 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
15b40 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
15b50 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
15b60 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
15b70 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
15b80 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
15b90 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
15ba0 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
15bb0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
15bc0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
15bd0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
15be0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
15bf0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
15c00 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
15c10 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
15c20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15c30 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
15c40 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
15c50 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
15c60 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
15c70 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ad */.  int rc =
15c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15c90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15ca0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ode */.  int isI
15cb0 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nWal = 0;       
15cc0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15cd0 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20   page is in log 
15ce0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  file */.  int pg
15cf0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
15d00 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
15d10 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
15d20 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
15d30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
15d40 41 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21  AGER_SHARED && !
15d50 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
15d60 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
15d70 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20  ->fd) );..  if( 
15d80 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50  NEVER(!isOpen(pP
15d90 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20  ager->fd)) ){.  
15da0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15db0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
15dc0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
15dd0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
15de0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
15df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15e00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
15e10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
15e20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  ){.    /* Try to
15e30 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66   pull the page f
15e40 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68  rom the write-ah
15e50 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  ead log. */.    
15e60 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
15e70 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ead(pPager->pWal
15e80 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c  , pgno, &isInWal
15e90 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61  , pgsz, pPg->pDa
15ea0 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ta);.  }.  if( r
15eb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15ec0 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20  !isInWal ){.    
15ed0 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70  i64 iOffset = (p
15ee0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
15ef0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
15f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15f10 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
15f20 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73   pPg->pData, pgs
15f30 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  z, iOffset);.   
15f40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15f50 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
15f60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
15f70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
15f80 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d    }..  if( pgno=
15f90 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =1 ){.    if( rc
15fa0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
15fb0 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75  the read is unsu
15fc0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
15fd0 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74  e dbFileVers[] t
15fe0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20  o something.    
15ff0 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e    ** that will n
16000 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20  ever be a valid 
16010 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64  file version.  d
16020 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61  bFileVers[] is a
16030 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f   copy.      ** o
16040 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f  f bytes 24..39 o
16050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
16060 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68   Bytes 28..31 sh
16070 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20  ould always be. 
16080 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20       ** zero or 
16090 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
160a0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
160b0 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61  . Bytes 32..35 a
160c0 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20  nd 35..39.      
160d0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67  ** should be pag
160e0 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  e numbers which 
160f0 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66  are never 0xffff
16100 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e  ffff.  So fillin
16110 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65  g.      ** pPage
16120 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  r->dbFileVers[] 
16130 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79  with all 0xff by
16140 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69  tes should suffi
16150 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ce..      **.   
16160 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63     ** For an enc
16170 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c  rypted database,
16180 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69   the situation i
16190 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20  s more complex: 
161a0 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20   bytes.      ** 
161b0 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
161c0 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65  tabase are white
161d0 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65   noise.  But the
161e0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a   probability of.
161f0 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e        ** white n
16200 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20  oising equaling 
16210 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
16220 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
16230 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
16240 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
16250 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
16260 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
16270 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
16280 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
16290 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
162a0 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
162b0 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
162c0 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
162d0 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
162e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
162f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
16300 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
16310 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
16320 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
16330 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
16340 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
16350 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
16360 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
16370 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
16380 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
16390 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
163a0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
163b0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
163c0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
163d0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
163e0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
163f0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
16400 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
16410 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16420 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16430 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
16440 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
16450 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16460 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16470 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
16480 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
16490 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
164a0 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
164b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
164c0 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
164d0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
164e0 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
164f0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
16500 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
16510 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
16520 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
16530 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
16540 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
16550 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
16560 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
16570 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
16580 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
16590 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
165a0 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
165b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
165c0 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
165d0 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
165e0 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
165f0 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
16600 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
16610 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
16620 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
16630 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
16640 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
16650 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
16660 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
16670 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16680 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
16690 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
166a0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
166b0 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
166c0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
166d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
166e0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
166f0 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
16700 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
16710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
16720 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
16730 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
16740 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50  gHdr *pPg;..  pP
16750 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
16760 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69  Lookup(pPager, i
16770 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  Pg);.  if( pPg )
16780 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
16790 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
167a0 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20  unt(pPg)==1 ){. 
167b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
167c0 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20  heDrop(pPg);.   
167d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
167e0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
167f0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
16800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16810 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
16820 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
16830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
16840 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
16850 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
16860 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69    /* Normally, i
16870 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
16880 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
16890 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65  any backup proce
168a0 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70  sses are.  ** up
168b0 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73  dated as data is
168c0 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74   copied out of t
168d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
168e0 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65  nal and into the
168f0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
16900 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65  This is not gene
16910 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77  rally possible w
16920 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61  ith a WAL databa
16930 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c  se, as.  ** roll
16940 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69  back involves si
16950 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20  mply truncating 
16960 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68  the log file. Th
16970 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a  erefore, if one.
16980 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61    ** or more fra
16990 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  mes have already
169a0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
169b0 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68   the log (and th
169c0 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c  erefore .  ** al
169d0 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  so copied into t
169e0 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61  he backup databa
169f0 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20  ses) as part of 
16a00 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
16a10 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75  ,.  ** the backu
16a20 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61  ps must be resta
16a30 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rted..  */.  sql
16a40 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
16a50 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
16a60 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  p);..  return rc
16a70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16a80 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
16a90 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ed to rollback a
16aa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
16ab0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a  a WAL database..
16ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16ad0 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50  gerRollbackWal(P
16ae0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
16af0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
16b20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
16b30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
16b40 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
16b50 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72  dirty pages to r
16b60 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46  evert */..  /* F
16b70 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20  or all pages in 
16b80 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61  the cache that a
16b90 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  re currently dir
16ba0 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61  ty or have alrea
16bb0 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69  dy.  ** been wri
16bc0 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f  tten (but not co
16bd0 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20  mmitted) to the 
16be0 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65  log file, do one
16bf0 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f   of the .  ** fo
16c00 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20  llowing:.  **.  
16c10 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74  **   + Discard t
16c20 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28  he cached page (
16c30 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c  if refcount==0),
16c40 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c   or.  **   + Rel
16c50 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  oad page content
16c60 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
16c70 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e  se (if refcount>
16c80 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  0)..  */.  pPage
16c90 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
16ca0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
16cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
16cc0 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  lUndo(pPager->pW
16cd0 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  al, pagerUndoCal
16ce0 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70  lback, (void *)p
16cf0 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20  Pager);.  pList 
16d00 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
16d10 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
16d20 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69  >pPCache);.  whi
16d30 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d  le( pList && rc=
16d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16d50 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
16d60 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
16d70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
16d80 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64  doCallback((void
16d90 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74   *)pPager, pList
16da0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69  ->pgno);.    pLi
16db0 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a  st = pNext;.  }.
16dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16dd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16de0 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
16df0 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
16e00 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20  WalFrames(). As 
16e10 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a  well as logging.
16e20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
16e30 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  of the list of p
16e40 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20 70  ages headed by p
16e50 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20  List (connected 
16e60 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74  by pDirty),.** t
16e70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74  his function not
16e80 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76 65  ifies any active
16e90 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
16ea0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 73  s that the pages
16eb0 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64   have.** changed
16ec0 2e 20 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  . .*/ .static in
16ed0 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
16ee0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16ef0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16f00 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
16f10 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
16f20 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
16f30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
16f40 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
16f50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
16f60 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
16f70 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
16f80 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
16f90 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
16fa0 6e 74 20 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20  nt isCommit,    
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fc0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
16fd0 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  s a commit */.  
16fe0 69 6e 74 20 73 79 6e 63 5f 66 6c 61 67 73 20 20  int sync_flags  
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
17010 20 74 6f 20 4f 73 53 79 6e 63 28 29 20 28 6f 72   to OsSync() (or
17020 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   0) */.){.  int 
17030 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
17040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17050 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
17060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17070 3e 70 57 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20  >pWal );.  rc = 
17080 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
17090 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
170a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
170b0 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
170c0 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
170d0 69 74 2c 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20  it, sync_flags. 
170e0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
170f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
17100 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
17110 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
17120 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
17130 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
17140 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
17150 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
17160 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
17170 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
17180 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
17190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
171a0 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64 20  ** Begin a read 
171b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
171c0 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  he WAL..**.** Th
171d0 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  is routine used 
171e0 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61  to be called "pa
171f0 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
17200 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65 73  )" because it es
17210 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b  sentially.** mak
17220 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66  es a snapshot of
17230 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
17240 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69   the current poi
17250 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70  nt in time and p
17260 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74  reserves.** that
17270 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73   snapshot for us
17280 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72 20  e by the reader 
17290 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63  in spite of conc
172a0 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73  urrently changes
172b0 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69   by.** other wri
172c0 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69  ters or checkpoi
172d0 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nters..*/.static
172e0 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52   int pagerBeginR
172f0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  eadTransaction(P
17300 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17310 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17340 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64  */.  int changed
17350 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
17360 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17370 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72 65  cache must be re
17380 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
17390 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
173a0 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73  ager) );..  /* s
173b0 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
173c0 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61  Transaction() wa
173d0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72  s not called for
173e0 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20   the previous.  
173f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
17400 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
17410 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61  XCLUSIVE.  So ca
17420 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77  ll it now.  If w
17430 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f  e.  ** are in lo
17440 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41  cking_mode=NORMA
17450 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20  L and EndRead() 
17460 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63  was previously c
17470 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20  alled,.  ** the 
17480 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69  duplicate call i
17490 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  s harmless..  */
174a0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  .  sqlite3WalEnd
174b0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
174c0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
174d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
174e0 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  lBeginReadTransa
174f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
17500 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20  al, &changed);. 
17510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17520 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 75  OK ){.    int du
17530 6d 6d 79 3b 0a 20 20 20 20 69 66 28 20 63 68 61  mmy;.    if( cha
17540 6e 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 61  nged ){.      pa
17550 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17560 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17570 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17580 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
17590 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
175a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
175b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
175c0 6e 74 28 70 50 61 67 65 72 2c 20 26 64 75 6d 6d  nt(pPager, &dumm
175d0 79 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  y);.  }.  pPager
175e0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
175f0 53 48 41 52 45 44 3b 0a 0a 20 20 72 65 74 75 72  SHARED;..  retur
17600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
17610 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
17620 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
17630 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
17640 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
17650 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
17660 74 73 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ts. Assuming no 
17670 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
17680 74 20 2a 70 45 78 69 73 74 73 20 74 6f 20 31 20  t *pExists to 1 
17690 69 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  if the file exis
176a0 74 73 2c 0a 2a 2a 20 6f 72 20 30 20 6f 74 68 65  ts,.** or 0 othe
176b0 72 77 69 73 65 20 61 6e 64 20 72 65 74 75 72 6e  rwise and return
176c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
176d0 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f  n IO or OOM erro
176e0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
176f0 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
17700 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
17710 74 69 63 20 69 6e 74 20 70 61 67 65 72 48 61 73  tic int pagerHas
17720 57 41 4c 28 50 61 67 65 72 20 2a 70 50 61 67 65  WAL(Pager *pPage
17730 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
17740 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
17750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17760 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
17770 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57  de */.  char *zW
17780 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
17790 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
177a0 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  of the WAL file 
177b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  */..  assert( !p
177c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
177d0 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69  );.  zWal = sqli
177e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d  te3_mprintf("%s-
177f0 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e 7a 46  wal", pPager->zF
17800 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
17810 21 7a 57 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  !zWal ){.    rc 
17820 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
17840 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
17850 73 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  s(pPager->pVfs, 
17860 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
17870 45 53 53 5f 45 58 49 53 54 53 2c 20 70 45 78 69  ESS_EXISTS, pExi
17880 73 74 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sts);.    sqlite
17890 33 5f 66 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20  3_free(zWal);.  
178a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
178b0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
178c0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
178d0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
178e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
178f0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
17900 72 0a 2a 2a 20 65 78 69 73 74 73 2e 20 49 66 20  r.** exists. If 
17910 69 74 20 64 6f 65 73 2c 20 6f 70 65 6e 20 74 68  it does, open th
17920 65 20 70 61 67 65 72 20 69 6e 20 57 41 4c 20 6d  e pager in WAL m
17930 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
17940 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
17950 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
17960 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
17970 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
17980 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
17990 44 45 5f 57 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e  DE_WAL..** If an
179a0 20 49 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72   IO or OOM error
179b0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
179c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
179d0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  code..**.** If t
179e0 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73 20 6f  he WAL file is o
179f0 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e  pened, also open
17a00 20 61 20 73 6e 61 70 73 68 6f 74 20 28 72 65 61   a snapshot (rea
17a10 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  d transaction)..
17a20 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
17a30 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
17a40 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
17a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
17a60 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
17a70 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
17a80 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
17a90 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
17aa0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
17ab0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
17ac0 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
17ad0 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
17ae0 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77 65 65  condition betwee
17af0 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
17b00 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  .** below and an
17b10 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
17b20 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
17b30 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
17b40 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
17b50 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
17b60 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
17b70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
17b80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17b90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
17ba0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
17bb0 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
17bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17bd0 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
17be0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72 63 20  xists */.    rc 
17bf0 3d 20 70 61 67 65 72 48 61 73 57 41 4c 28 70 50  = pagerHasWAL(pP
17c00 61 67 65 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20  ager, &isWal);. 
17c10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17c20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
17c30 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
17c40 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17c50 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17c60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17c70 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
17c80 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
17cb0 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
17cc0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
17cd0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
17ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
17cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
17d00 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
17d10 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
17d20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
17d30 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
17d40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
17d50 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
17d60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
17d70 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
17d80 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65  ** Playback save
17d90 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74  point pSavepoint
17da0 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f  . Or, if pSavepo
17db0 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20  int==NULL, then 
17dc0 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20  playback.** the 
17dd0 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
17de0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
17df0 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d  case pSavepoint=
17e00 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65  =NULL occurs whe
17e10 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b  n .** a ROLLBACK
17e20 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69   TO command is i
17e30 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45  nvoked on a SAVE
17e40 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20  POINT that is a 
17e50 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
17e60 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  savepoint..**.**
17e70 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74   When pSavepoint
17e80 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65   is not NULL (me
17e90 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e  aning a non-tran
17ea0 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
17eb0 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72  t is .** being r
17ec0 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65  olled back), the
17ed0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63  n the rollback c
17ee0 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f  onsists of up to
17ef0 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a   three stages,.*
17f00 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74  * performed in t
17f10 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69  he order specifi
17f20 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  ed:.**.**   * Pa
17f30 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62  ges are played b
17f40 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
17f50 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
17f60 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20  ng at byte.**   
17f70 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61    offset PagerSa
17f80 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
17f90 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
17fa0 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  o .**     PagerS
17fb0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
17fc0 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65  set, or to the e
17fd0 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
17fe0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
17ff0 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70  le if PagerSavep
18000 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
18010 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20  is zero..**.**  
18020 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70   * If PagerSavep
18030 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
18040 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
18050 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79  n pages are play
18060 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73  ed.**     back s
18070 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65  tarting from the
18080 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
18090 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
180a0 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61  owing .**     Pa
180b0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
180c0 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65  rOffset to the e
180d0 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
180e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
180f0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
18100 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63   then played bac
18110 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  k from the sub-j
18120 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61  ournal file, sta
18130 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74  rting.**     wit
18140 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  h the PagerSavep
18150 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64  oint.iSubRec and
18160 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
18170 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20  he end of.**    
18180 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18190 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68  e..**.** Through
181a0 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  out the rollback
181b0 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74   process, each t
181c0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f  ime a page is ro
181d0 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a  lled back, the.*
181e0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
181f0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20  bit is set in a 
18200 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
18210 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65   (variable pDone
18220 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65   in the.** imple
18230 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29  mentation below)
18240 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
18250 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20  o ensure that a 
18260 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  page is only.** 
18270 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
18280 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73  first time it is
18290 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
182a0 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  either journal..
182b0 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f  **.** If pSavepo
182c0 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  int is NULL, the
182d0 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79  n pages are only
182e0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
182f0 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  m the main.** jo
18300 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72  urnal file. Ther
18310 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
18320 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69   a bitvec in thi
18330 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  s case..**.** In
18340 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65   either case, be
18350 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f  fore playback co
18360 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65  mmences the Page
18370 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  r.dbSize variabl
18380 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f  e.** is reset to
18390 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
183a0 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73  it held at the s
183b0 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65  tart of the save
183c0 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72  point .** (or tr
183d0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70  ansaction). No p
183e0 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d  age with a page-
183f0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
18400 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a  han this value.*
18410 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  * is played back
18420 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f  . If one is enco
18430 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69  untered it is si
18440 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  mply skipped..*/
18450 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18460 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
18470 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
18480 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  , PagerSavepoint
18490 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20   *pSavepoint){. 
184a0 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
184b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66            /* Eff
184c0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
184d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
184e0 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
184f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18500 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65   End of first se
18510 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f  gment of main-jo
18520 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f  urnal records */
18530 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18540 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
18550 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18560 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20  Bitvec *pDone = 
18570 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76  0;       /* Bitv
18580 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67  ec to ensure pag
18590 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  es played back o
185a0 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61  nly once */..  a
185b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
185c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
185d0 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
185e0 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
185f0 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
18600 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
18610 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
18620 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
18630 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
18640 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
18650 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
18660 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
18670 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
18680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18690 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
186a0 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
186b0 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
186c0 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
186d0 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
186e0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
186f0 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
18700 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
18710 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
18720 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
18730 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
18740 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
18750 69 7a 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ize;..  if( !pSa
18760 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
18770 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18780 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
18790 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
187a0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
187b0 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
187c0 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
187d0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
187e0 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
187f0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
18800 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
18810 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
18820 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
18830 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
18840 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
18850 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
18860 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
18870 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
18880 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
18890 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
188a0 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
188b0 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
188c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
188d0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
188e0 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
188f0 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
18900 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
18910 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
18920 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
18930 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
18940 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
18950 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
18960 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
18970 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
18980 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
18990 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
189a0 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
189b0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
189c0 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
189d0 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
189e0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
189f0 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
18a00 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
18a10 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
18a20 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
18a30 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
18a40 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
18a50 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
18a60 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
18a70 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
18a80 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
18a90 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
18aa0 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
18ab0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
18ac0 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
18ad0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
18ae0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
18af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
18b00 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
18b10 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
18b20 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
18b30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
18b40 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
18b50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
18b60 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
18b70 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
18b80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
18b90 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
18ba0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18bb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
18bc0 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
18bd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18be0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
18bf0 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
18c00 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
18c10 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
18c20 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
18c30 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
18c40 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
18c50 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
18c60 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
18c70 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
18c80 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
18c90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
18ca0 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
18cb0 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
18cc0 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
18cd0 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
18ce0 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
18cf0 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
18d00 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
18d10 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
18d20 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
18d30 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
18d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18d50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
18d60 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
18d70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18d80 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
18d90 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
18da0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
18db0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
18dc0 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
18dd0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
18de0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
18df0 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
18e00 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
18e10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
18e20 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
18e30 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
18e40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
18e50 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
18e60 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
18e70 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
18e80 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
18e90 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
18ea0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
18eb0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
18ec0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
18ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
18ee0 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
18ef0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
18f00 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
18f10 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
18f20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
18f30 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
18f40 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
18f50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
18f60 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
18f70 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
18f80 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
18f90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
18fa0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
18fb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
18fc0 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
18fd0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
18fe0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
18ff0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
19000 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
19010 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
19020 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
19030 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
19040 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
19050 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
19060 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
19070 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
19080 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
19090 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
190a0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
190b0 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
190c0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
190d0 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
190e0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
190f0 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
19100 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
19110 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
19120 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
19130 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
19140 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
19150 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
19160 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
19170 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
19180 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
19190 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f  offset = pSavepo
191a0 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
191b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
191c0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
191d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
191e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
191f0 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e  lite3WalSavepoin
19200 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57  tUndo(pPager->pW
19210 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  al, pSavepoint->
19220 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d  aWalData);.    }
19230 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76  .    for(ii=pSav
19240 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b  epoint->iSubRec;
19250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19260 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75  & ii<pPager->nSu
19270 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  bRec; ii++){.   
19280 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
19290 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  t==ii*(4+pPager-
192a0 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
192b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
192c0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
192d0 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74  (pPager, &offset
192e0 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a  , pDone, 0, 1);.
192f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
19310 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
19320 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
19330 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
19340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19350 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
19360 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
19370 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
19380 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
19390 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
193a0 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
193b0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
193c0 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
193d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
193e0 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
193f0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
19400 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
19410 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
19420 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
19430 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
19440 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
19450 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
19460 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
19470 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
19480 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
19490 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
194a0 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
194b0 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
194c0 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
194d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
194e0 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
194f0 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
19500 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
19510 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
19520 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
19530 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
19540 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
19550 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
19560 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
19570 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
19580 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
19590 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
195a0 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
195b0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
195c0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
195d0 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
195e0 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
195f0 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
19600 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
19610 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
19620 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
19630 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
19640 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
19650 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
19660 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
19670 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
19680 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
19690 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
196a0 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
196b0 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
196c0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
196d0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
196e0 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
196f0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
19700 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
19710 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
19720 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
19730 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
19740 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
19750 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
19760 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
19770 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
19780 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
19790 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
197a0 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
197b0 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
197c0 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
197d0 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
197e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
197f0 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
19800 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
19810 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
19820 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
19830 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
19840 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
19850 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
19860 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
19870 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
19880 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
19890 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
198a0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
198b0 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
198c0 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
198d0 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
198e0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
198f0 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
19900 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
19910 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
19920 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
19930 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
19940 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
19950 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
19960 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
19970 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
19980 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
19990 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
199a0 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29   int bFullFsync)
199b0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
199c0 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20  nc =  (level==1 
199d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
199e0 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
199f0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
19a00 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50  (level==3 && !pP
19a10 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20  ager->tempFile) 
19a20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?1:0;.  pPager->
19a30 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46  sync_flags = (bF
19a40 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f  ullFsync?SQLITE_
19a50 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45  SYNC_FULL:SQLITE
19a60 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
19a70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
19a80 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
19a90 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
19aa0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
19ab0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
19ac0 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
19ad0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
19ae0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
19af0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
19b00 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
19b10 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
19b20 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
19b30 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
19b40 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
19b50 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
19b60 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
19b70 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
19b80 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
19b90 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
19ba0 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
19bb0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
19bc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
19bd0 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
19be0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
19bf0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
19c00 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
19c10 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
19c20 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
19c30 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
19c40 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
19c50 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
19c60 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
19c70 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
19c80 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
19c90 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
19ca0 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
19cb0 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
19cc0 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
19cd0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
19ce0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
19cf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
19d00 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
19d10 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
19d20 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
19d30 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
19d40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
19d50 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
19d60 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19d70 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
19d80 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
19d90 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
19da0 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
19db0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
19dc0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
19dd0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
19de0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
19df0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
19e00 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
19e10 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
19e20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e40 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
19e50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19e60 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
19e70 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
19e80 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
19e90 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
19ea0 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
19eb0 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
19ec0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
19ed0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
19ee0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
19ef0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19f00 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
19f10 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
19f20 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
19f30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19f40 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
19f50 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
19f60 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
19f70 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
19f80 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
19f90 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
19fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19fb0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
19fc0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
19fd0 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
19fe0 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
19ff0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
1a000 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
1a010 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
1a020 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
1a030 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
1a040 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
1a050 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
1a060 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
1a070 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
1a080 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
1a090 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
1a0a0 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
1a0b0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1a0c0 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
1a0d0 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
1a0e0 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
1a0f0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
1a100 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
1a110 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
1a120 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
1a130 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
1a140 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
1a150 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
1a160 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1a180 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
1a190 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
1a1a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a1b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a1c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a1d0 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
1a1e0 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
1a1f0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
1a200 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
1a210 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
1a220 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
1a230 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
1a240 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
1a250 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
1a260 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
1a270 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
1a280 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
1a290 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
1a2a0 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
1a2b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
1a2c0 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
1a2d0 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
1a2e0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
1a2f0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
1a300 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
1a310 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
1a320 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
1a330 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
1a340 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
1a350 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
1a360 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a380 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1a390 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
1a3a0 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
1a3b0 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
1a3c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
1a3d0 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
1a3e0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
1a3f0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a410 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
1a420 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
1a430 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65   */.){  .  pPage
1a440 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
1a450 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
1a460 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
1a470 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
1a480 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a  yHandlerArg;.}..
1a490 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
1a4a0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
1a4b0 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
1a4c0 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
1a4d0 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
1a4e0 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
1a4f0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1a500 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1a510 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
1a520 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1a530 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1a540 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
1a550 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
1a560 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
1a570 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
1a580 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
1a5b0 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
1a5c0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1a5d0 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
1a5e0 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
1a5f0 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
1a600 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
1a610 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
1a620 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
1a630 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
1a640 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
1a650 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
1a660 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
1a670 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
1a680 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1a690 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
1a6a0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
1a6b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1a6c0 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
1a6d0 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
1a6e0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
1a6f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
1a700 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
1a710 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
1a720 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
1a730 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f  RRUPT or SQLITE_
1a740 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
1a750 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
1a760 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a770 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1a780 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
1a790 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
1a7a0 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
1a7b0 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
1a7c0 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
1a7d0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
1a7e0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
1a7f0 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
1a800 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
1a810 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
1a820 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
1a830 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
1a840 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
1a850 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
1a860 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1a870 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
1a880 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
1a890 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
1a8a0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
1a8b0 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
1a8c0 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
1a8d0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
1a8e0 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
1a8f0 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
1a900 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1a910 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
1a920 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1a930 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
1a940 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
1a950 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
1a960 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
1a970 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
1a980 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
1a990 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
1a9a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
1a9b0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
1a9c0 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
1a9d0 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
1a9e0 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
1a9f0 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
1aa00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1aa10 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
1aa20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
1aa30 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
1aa40 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
1aa50 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
1aa60 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
1aa70 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
1aa80 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
1aa90 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
1aaa0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
1aab0 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
1aac0 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
1aad0 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1aae0 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
1aaf0 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
1ab00 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
1ab10 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
1ab20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
1ab30 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
1ab40 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
1ab50 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
1ab60 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53  ger, u16 *pPageS
1ab70 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
1ab80 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  e){.  int rc = p
1ab90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1aba0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1abb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20  E_OK ){.    u16 
1abc0 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
1abd0 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
1abe0 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
1abf0 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
1ac00 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
1ac10 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
1ac20 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ZE) );.    if( (
1ac30 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30  pPager->memDb==0
1ac40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
1ac50 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73  ze==0).     && s
1ac60 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
1ac70 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
1ac80 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 20 26  ache)==0 .     &
1ac90 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
1aca0 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
1acb0 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 29 7b  pageSize .    ){
1acc0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65  .      char *pNe
1acd0 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
1ace0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
1acf0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
1ad00 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( !pNew ){.    
1ad10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ad20 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
1ad30 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65  se{.        page
1ad40 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1ad50 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1ad60 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
1ad70 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71  Size;.        sq
1ad80 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
1ad90 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
1ada0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1adb0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
1adc0 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ew;.        sqli
1add0 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
1ade0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
1adf0 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
1ae00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ae10 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20     *pPageSize = 
1ae20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67  (u16)pPager->pag
1ae30 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e  eSize;.    if( n
1ae40 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73  Reserve<0 ) nRes
1ae50 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e  erve = pPager->n
1ae60 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
1ae70 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
1ae80 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30   && nReserve<100
1ae90 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1aea0 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31 36  >nReserve = (i16
1aeb0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70  )nReserve;.    p
1aec0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
1aed0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
1aee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1aef0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1af00 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f  er to the "tempo
1af10 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65  rary page" buffe
1af20 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c  r held internall
1af30 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65  y.** by the page
1af40 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75  r.  This is a bu
1af50 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67  ffer that is big
1af60 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
1af70 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f  the.** entire co
1af80 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62  ntent of a datab
1af90 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  ase page.  This 
1afa0 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69  buffer is used i
1afb0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72  nternally.** dur
1afc0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ing rollback and
1afd0 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69   will be overwri
1afe0 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20  tten whenever a 
1aff0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
1b000 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d  rs.  But other m
1b010 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20  odules are free 
1b020 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61  to use it too, a
1b030 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20  s long as.** no 
1b040 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61  rollbacks are ha
1b050 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  ppening..*/.void
1b060 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65   *sqlite3PagerTe
1b070 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70  mpSpace(Pager *p
1b080 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1b090 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1b0a0 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ce;.}../*.** Att
1b0b0 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
1b0c0 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65  maximum database
1b0d0 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d   page count if m
1b0e0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
1b0f0 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  e. .** Make no c
1b100 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65  hanges if mxPage
1b110 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
1b120 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72  tive.  And never
1b130 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d   reduce the.** m
1b140 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
1b150 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72  t below the curr
1b160 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
1b170 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1b180 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78  Regardless of mx
1b190 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
1b1a0 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
1b1b0 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
1b1c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1b1d0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67  MaxPageCount(Pag
1b1e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1b1f0 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
1b200 50 61 67 65 3b 0a 20 20 69 66 28 20 6d 78 50 61  Page;.  if( mxPa
1b210 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
1b220 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
1b230 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  age;.  }.  if( p
1b240 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1b250 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
1b260 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
1b270 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
1b280 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73  &nPage);.    ass
1b290 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78 50  ert( pPager->mxP
1b2a0 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  gno>=nPage );.  
1b2b0 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
1b2c0 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
1b2d0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1b2e0 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
1b2f0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
1b300 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
1b310 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
1b320 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
1b330 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
1b340 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
1b350 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
1b360 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
1b370 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
1b380 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
1b390 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
1b3a0 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
1b3b0 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
1b3c0 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
1b3d0 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
1b3e0 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
1b3f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1b400 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
1b410 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1b420 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
1b430 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
1b440 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
1b450 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
1b460 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
1b470 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
1b480 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
1b490 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
1b4a0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
1b4b0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
1b4c0 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
1b4d0 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
1b4e0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1b4f0 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
1b500 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b510 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
1b520 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1b530 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
1b540 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
1b550 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
1b560 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1b570 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
1b580 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
1b590 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
1b5a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1b5b0 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
1b5c0 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
1b5d0 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
1b5e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1b5f0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
1b600 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
1b610 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
1b620 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
1b630 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
1b640 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
1b650 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
1b660 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
1b670 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
1b680 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
1b690 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
1b6a0 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
1b6b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
1b6c0 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
1b6d0 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
1b6e0 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
1b6f0 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
1b700 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
1b710 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
1b720 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
1b730 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
1b740 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
1b750 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
1b760 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1b770 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
1b780 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
1b790 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b7a0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
1b7b0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
1b7c0 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
1b7d0 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
1b7e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1b7f0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
1b800 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
1b810 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
1b820 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
1b830 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1b840 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
1b850 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
1b860 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1b870 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1b880 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1b890 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
1b8a0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
1b8b0 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
1b8c0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
1b8d0 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
1b8e0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
1b8f0 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
1b900 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
1b910 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
1b920 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
1b930 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
1b940 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
1b950 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 23  Wal(pPager) );.#
1b960 69 66 20 30 0a 20 20 69 66 28 20 70 61 67 65 72  if 0.  if( pager
1b970 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1b980 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 57 61  {.    int isInWa
1b990 6c 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  l = 0;.    rc = 
1b9a0 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70  sqlite3WalRead(p
1b9b0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20  Pager->pWal, 1, 
1b9c0 26 69 73 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65  &isInWal, N, pDe
1b9d0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  st);.    if( rc!
1b9e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
1b9f0 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  InWal ){.      r
1ba00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ba10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
1ba20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1ba30 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
1ba40 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
1ba50 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1ba60 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
1ba70 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1ba80 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
1ba90 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
1baa0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1bab0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1bac0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1bad0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1bae0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1baf0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
1bb00 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1bb10 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1bb20 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
1bb30 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67  ed .** with pPag
1bb40 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  er. Normally, th
1bb50 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  is is calculated
1bb60 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69   as (<db file si
1bb70 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29  ze>/<page-size>)
1bb80 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  ..** However, if
1bb90 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
1bba0 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
1bbb0 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
1bbc0 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
1bbd0 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
1bbe0 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
1bbf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1bc00 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20  ger is in error 
1bc10 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
1bc20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bc30 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
1bc40 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
1bc50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1bc60 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c  ed and *pnPage l
1bc70 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f  eft unchanged. O
1bc80 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  r,.** if the fil
1bc90 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20  e system has to 
1bca0 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74  be queried for t
1bcb0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1bcc0 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71  ile and.** the q
1bcd0 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74  uery attempt ret
1bce0 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  urns an IO error
1bcf0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
1bd00 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
1bd10 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
1bd20 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
1bd30 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1bd40 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
1bd50 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1bd60 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
1bd70 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
1bd80 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74  d *pnPage is set
1bd90 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1bda0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1bdb0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
1bdc0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1bdd0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
1bde0 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
1bdf0 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20  ){.  Pgno nPage 
1be00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1be10 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
1be20 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
1be30 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
1be40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1be50 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1be60 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20  . Store this in 
1be70 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  nPage. */.  if( 
1be80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
1be90 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  lid ){.    nPage
1bea0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1beb0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
1bec0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1bed0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
1bee0 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
1bef0 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20  ileSize() */.   
1bf00 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
1bf10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1bf20 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72   size in bytes r
1bf30 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
1bf40 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20  eSize() */..    
1bf50 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
1bf60 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
1bf70 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1bf80 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
1bf90 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65  sqlite3WalDbsize
1bfa0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26  (pPager->pWal, &
1bfb0 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  nPage);.    }.. 
1bfc0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1bfd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bfe0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1bff0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1c000 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
1c010 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1c020 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1c030 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1c040 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
1c050 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1c060 2d 3e 66 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20  ->fd, &n)) ){.  
1c070 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
1c080 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1c090 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1c0a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1c0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c0c0 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
1c0d0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
1c0e0 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31         nPage = 1
1c0f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c100 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28         nPage = (
1c110 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72  Pgno)(n / pPager
1c120 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c130 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1c140 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1c150 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1c160 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1c170 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
1c180 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c190 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
1c1a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c1b0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b  dbSizeValid = 1;
1c1c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c1d0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
1c1e0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c1f0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67  in the file is g
1c200 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1c210 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1c220 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1c230 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1c240 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1c250 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1c260 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1c270 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1c280 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1c290 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1c2a0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1c2b0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1c2c0 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70   /* Set the outp
1c2d0 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  ut variable and 
1c2e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c2f0 20 2a 2f 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   */.  *pnPage = 
1c300 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1c310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1c320 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
1c330 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1c340 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
1c350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c360 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
1c370 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
1c380 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
1c390 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c3a0 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
1c3b0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1c3c0 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
1c3d0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1c3e0 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
1c3f0 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
1c400 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
1c410 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
1c420 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1c430 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
1c440 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
1c450 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
1c460 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
1c470 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
1c480 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
1c490 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
1c4a0 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
1c4b0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
1c4c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1c4d0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1c4e0 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
1c4f0 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
1c500 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
1c510 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
1c520 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
1c530 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
1c540 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
1c550 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
1c560 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
1c570 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1c580 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
1c590 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
1c5a0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
1c5b0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
1c5c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1c5f0 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  /..  /* The OS l
1c600 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
1c610 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1c620 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
1c630 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
1c640 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
1c650 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
1c660 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
1c670 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
1c680 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
1c690 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
1c6a0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
1c6b0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
1c6c0 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
1c6d0 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
1c6e0 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
1c6f0 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74  t be unknown. It
1c700 0a 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68  .  ** must not h
1c710 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
1c720 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
1c730 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c740 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c750 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1c760 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
1c770 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id==0 );.  asser
1c780 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1c790 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
1c7a0 7c 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  | pPager->dbModi
1c7b0 66 69 65 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  fied==0 );..  /*
1c7c0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
1c7d0 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
1c7e0 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
1c7f0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
1c800 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
1c810 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  held, or one of 
1c820 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73  the transistions
1c830 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
1c840 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
1c850 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
1c860 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
1c870 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
1c880 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
1c890 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
1c8a0 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
1c8b0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  rt( (pPager->sta
1c8c0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  te>=locktype).  
1c8d0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
1c8e0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1c8f0 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
1c900 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  ==PAGER_SHARED).
1c910 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
1c920 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1c930 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b  RESERVED && lock
1c940 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c  type==PAGER_EXCL
1c950 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69  USIVE).  );..  i
1c960 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1c970 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
1c980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1c9a0 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
1c9b0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1c9c0 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
1c9d0 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
1c9e0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
1c9f0 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
1ca00 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
1ca10 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
1ca20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1ca30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca40 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1ca50 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
1ca60 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1ca70 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
1ca80 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
1ca90 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
1caa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cab0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65  ** Function asse
1cac0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
1cad0 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65  aint(pPager) che
1cae0 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  cks that one of 
1caf0 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
1cb00 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c  g is true for al
1cb10 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75  l dirty pages cu
1cb20 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
1cb30 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a  age-cache:.**.**
1cb40 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e     a) The page n
1cb50 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
1cb60 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1cb70 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
1cb80 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20  **      current 
1cb90 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
1cba0 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a  in pages, OR.**.
1cbb0 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70  **   b) if the p
1cbc0 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65  age content were
1cbd0 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73   written at this
1cbe0 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20   time, it would 
1cbf0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e  not.**      be n
1cc00 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
1cc10 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
1cc20 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65  ntent out to the
1cc30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
1cc40 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69       (as determi
1cc50 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  ned by function 
1cc60 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1cc70 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ())..**.** If th
1cc80 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65  e condition asse
1cc90 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rted by this fun
1cca0 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ction were not t
1ccb0 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20  rue, and the.** 
1ccc0 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20  dirty page were 
1ccd0 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20  to be discarded 
1cce0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76  from the cache v
1ccf0 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65  ia the pagerStre
1cd00 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  ss().** routine,
1cd10 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77   pagerStress() w
1cd20 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74  ould not write t
1cd30 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1cd40 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68  content to.** th
1cd50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1cd60 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   If a savepoint 
1cd70 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65  transaction were
1cd80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74   rolled back aft
1cd90 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65  er.** this happe
1cda0 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74  ned, the correct
1cdb0 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64   behaviour would
1cdc0 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74   be to restore t
1cdd0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f  he current.** co
1cde0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1cdf0 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63  e. However, sinc
1ce00 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69  e this content i
1ce10 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e  s not present in
1ce20 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64   either.** the d
1ce30 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
1ce40 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  the portion of t
1ce50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1ce60 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d  nal and .** sub-
1ce70 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62  journal rolled b
1ce80 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ack the content 
1ce90 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73  could not be res
1cea0 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  tored and the.**
1ceb0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1cec0 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  would become cor
1ced0 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72  rupt. It is ther
1cee0 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20  efore fortunate 
1cef0 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69  that .** this ci
1cf00 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f  rcumstance canno
1cf10 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20  t arise..*/.#if 
1cf20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1cf30 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69  EBUG).static voi
1cf40 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
1cf50 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48  ConstraintCb(PgH
1cf60 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  dr *pPg){.  asse
1cf70 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
1cf80 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
1cf90 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71  assert( !subjReq
1cfa0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c  uiresPage(pPg) |
1cfb0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67  | pPg->pgno<=pPg
1cfc0 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ->pPager->dbSize
1cfd0 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   );.}.static voi
1cfe0 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  d assertTruncate
1cff0 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72  Constraint(Pager
1d000 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
1d010 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
1d020 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
1d030 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72  PCache, assertTr
1d040 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
1d050 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  Cb);.}.#else.# d
1d060 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e  efine assertTrun
1d070 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
1d080 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f  Pager).#endif../
1d090 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
1d0a0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
1d0b0 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
1d0c0 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
1d0d0 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1d0e0 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
1d0f0 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
1d100 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
1d110 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
1d120 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
1d130 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
1d140 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
1d150 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
1d160 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
1d170 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
1d180 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1d190 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
1d1a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d1b0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1d1c0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1d1d0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
1d1e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d1f0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
1d200 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d210 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
1d220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1d230 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1d240 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1d250 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d260 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74   nPage;.  assert
1d270 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1d280 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a  nt(pPager);.}...
1d290 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d2a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
1d2b0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1d2c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1d2d0 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
1d2e0 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
1d2f0 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
1d300 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
1d310 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
1d320 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
1d330 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
1d340 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
1d350 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
1d360 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
1d370 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
1d380 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
1d390 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
1d3a0 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
1d3b0 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
1d3c0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1d3d0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
1d3e0 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
1d3f0 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
1d400 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
1d410 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
1d420 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
1d430 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
1d440 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
1d450 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
1d460 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
1d470 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
1d480 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
1d490 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
1d4a0 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
1d4b0 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
1d4c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1d4d0 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
1d4e0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1d4f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d500 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
1d510 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1d520 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1d530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1d540 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1d550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d560 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1d570 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
1d580 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
1d590 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d5a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1d5b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1d5c0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1d5d0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1d5e0 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
1d5f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d600 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
1d610 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
1d620 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
1d630 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
1d640 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
1d650 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
1d660 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
1d670 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d680 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
1d690 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1d6a0 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
1d6b0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
1d6c0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
1d6d0 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
1d6e0 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
1d6f0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
1d700 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
1d710 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
1d720 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
1d730 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1d740 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
1d750 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
1d760 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
1d770 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1d780 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
1d790 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
1d7a0 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
1d7b0 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
1d7c0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
1d7d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1d7e0 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
1d7f0 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
1d800 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
1d810 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
1d820 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
1d830 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d840 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
1d850 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1d860 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
1d870 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
1d880 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
1d890 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1d8a0 65 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  e;..  disable_si
1d8b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1d8c0 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
1d8d0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
1d8e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
1d8f0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
1d900 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1d910 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
1d920 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d930 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
1d940 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20  (pPager->pWal,. 
1d950 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79     (pPager->noSy
1d960 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d  nc ? 0 : pPager-
1d970 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20  >sync_flags), . 
1d980 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
1d990 69 7a 65 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20  ize, pTmp.  );. 
1d9a0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
1d9b0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65  0;.#endif.  page
1d9c0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1d9d0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1d9e0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1d9f0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
1da00 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61  e{.    /* Set Pa
1da10 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  ger.journalHdr t
1da20 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e  o -1 for the ben
1da30 65 66 69 74 20 6f 66 20 74 68 65 20 70 61 67 65  efit of the page
1da40 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20  r_playback() .  
1da50 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20    ** call which 
1da60 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d  may be made from
1da70 20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c   within pagerUnl
1da80 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29  ockAndRollback()
1da90 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69  . If it.    ** i
1daa0 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74  s not -1, then t
1dab0 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  he unsynced port
1dac0 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a  ion of an open j
1dad0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a  ournal file may.
1dae0 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64      ** be played
1daf0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
1db00 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
1db10 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
1db20 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  rs while.    ** 
1db30 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
1db40 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
1db50 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  may become corru
1db60 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  pt..    */.    i
1db70 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1db80 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
1db90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1dba0 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
1dbb0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1dbc0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
1dbd0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
1dbe0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
1dbf0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1dc00 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
1dc10 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1dc20 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
1dc30 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
1dc40 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1dc50 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
1dc60 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
1dc70 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
1dc80 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1dc90 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
1dca0 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
1dcb0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1dcc0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
1dcd0 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
1dce0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1dcf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
1dd00 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
1dd10 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
1dd20 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
1dd30 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1dd40 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
1dd50 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
1dd60 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
1dd70 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
1dd80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
1dd90 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
1dda0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
1ddb0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1ddc0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
1ddd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
1dde0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
1ddf0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1de00 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1de10 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
1de20 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
1de30 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
1de40 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
1de50 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
1de60 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
1de70 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
1de80 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
1de90 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1dea0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
1deb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1dec0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
1ded0 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
1dee0 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
1def0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1df00 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
1df10 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
1df20 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
1df30 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
1df40 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1df50 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
1df60 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
1df70 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
1df80 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1df90 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1dfa0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
1dfb0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1dfc0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
1dfd0 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
1dfe0 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20  ync flag is not 
1dff0 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
1e000 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20  unction is a.** 
1e010 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1e020 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
1e030 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
1e040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
1e050 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76  e.** and the dev
1e060 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1e070 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66  ics of the the f
1e080 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
1e090 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1e0a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1e0b0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
1e0c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1e0d0 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
1e0e0 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
1e0f0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
1e100 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1e110 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1e120 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
1e130 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1e140 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
1e150 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
1e160 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1e170 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
1e180 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
1e190 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
1e1a0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1e1b0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
1e1c0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
1e1d0 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
1e1e0 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
1e1f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1e200 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
1e210 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
1e220 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1e230 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1e240 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
1e250 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
1e260 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
1e270 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
1e280 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
1e290 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
1e2a0 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
1e2b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1e2c0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
1e2d0 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
1e2e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
1e2f0 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
1e300 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
1e310 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
1e320 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
1e330 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
1e340 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
1e350 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
1e360 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
1e370 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
1e380 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
1e390 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
1e3a0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1e3b0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
1e3c0 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e  **.** The Pager.
1e3d0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1e3e0 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66 6f   never be set fo
1e3f0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1e400 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c  s, or any.** fil
1e410 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e  e operating in n
1e420 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67  o-sync mode (Pag
1e430 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f  er.noSync set to
1e440 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a   non-zero)..**.*
1e450 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1e460 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
1e470 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
1e480 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
1e490 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
1e4a0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
1e4b0 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
1e4c0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1e4d0 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
1e4e0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1e4f0 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
1e500 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1e510 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1e520 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1e530 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
1e540 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1e550 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1e560 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1e570 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1e580 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1e590 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1e5a0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1e5b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1e5c0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
1e5d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e600 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1e610 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1e620 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1e630 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1e640 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
1e650 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1e660 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
1e670 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
1e680 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1e690 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
1e6a0 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
1e6b0 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
1e6c0 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
1e6d0 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
1e6e0 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
1e6f0 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
1e700 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
1e710 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
1e720 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
1e730 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
1e740 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
1e750 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
1e760 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
1e770 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
1e780 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
1e790 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
1e7a0 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
1e7b0 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
1e7c0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1e7d0 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
1e7e0 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
1e7f0 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
1e800 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
1e810 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1e820 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
1e830 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
1e840 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
1e850 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
1e860 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
1e870 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
1e880 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
1e890 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
1e8a0 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
1e8b0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
1e8c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1e8d0 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
1e8e0 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
1e8f0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1e900 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
1e910 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
1e920 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
1e930 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
1e940 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
1e950 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1e960 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
1e970 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
1e980 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1e990 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
1e9a0 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
1e9b0 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
1e9c0 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
1e9d0 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
1e9e0 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
1e9f0 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
1ea00 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
1ea10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1ea20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
1ea30 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
1ea40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
1ea50 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
1ea60 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
1ea70 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
1ea80 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
1ea90 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
1eaa0 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
1eab0 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
1eac0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
1ead0 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
1eae0 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
1eaf0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
1eb00 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
1eb10 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
1eb20 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1eb30 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
1eb40 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
1eb50 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
1eb60 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
1eb70 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
1eb80 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
1eb90 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
1eba0 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
1ebb0 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
1ebc0 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
1ebd0 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
1ebe0 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
1ebf0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
1ec00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ec10 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
1ec20 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
1ec30 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
1ec40 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
1ec50 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1ec60 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
1ec70 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
1ec80 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
1ec90 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
1eca0 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
1ecb0 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
1ecc0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
1ecd0 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
1ece0 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
1ecf0 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
1ed00 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
1ed10 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
1ed20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ed30 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1ed40 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
1ed50 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
1ed60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ed70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ed80 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
1ed90 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
1eda0 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
1edb0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1edc0 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
1edd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1ede0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1edf0 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
1ee00 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
1ee10 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
1ee20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1ee30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1ee40 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1ee50 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1ee60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1ee70 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
1ee80 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1ee90 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1eea0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1eeb0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
1eec0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
1eed0 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
1eee0 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
1eef0 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
1ef00 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
1ef10 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
1ef20 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
1ef30 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
1ef40 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
1ef50 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
1ef60 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
1ef70 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
1ef80 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
1ef90 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
1efa0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
1efb0 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
1efc0 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
1efd0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1efe0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
1eff0 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
1f000 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
1f010 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
1f020 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
1f030 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
1f040 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1f050 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
1f060 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
1f070 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
1f080 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
1f090 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
1f0a0 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
1f0b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
1f0c0 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
1f0d0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
1f0e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1f0f0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
1f100 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
1f110 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1f120 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
1f130 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1f140 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
1f150 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1f160 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
1f170 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1f180 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1f190 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
1f1a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1f1b0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1f1c0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1f1d0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
1f1e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f1f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
1f210 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
1f220 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72   %lld\n", pPager
1f230 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
1f240 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20  lHdr));.        
1f250 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1f260 69 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ite(.           
1f270 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48   pPager->jfd, zH
1f280 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48  eader, sizeof(zH
1f290 65 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e  eader), pPager->
1f2a0 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
1f2b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1f2c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f2d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f2e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
1f2f0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1f300 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
1f310 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
1f320 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1f330 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1f340 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1f350 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
1f360 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1f370 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1f380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1f390 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1f3a0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1f3b0 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
1f3c0 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
1f3d0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
1f3e0 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
1f3f0 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
1f400 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1f410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f420 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f440 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
1f450 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
1f460 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
1f470 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e  nced. Set Pager.
1f480 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
1f490 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65   to zero and cle
1f4a0 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
1f4b0 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61  D_SYNC flag on a
1f4c0 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a  ll pagess..    *
1f4d0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  /.    pPager->ne
1f4e0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1f4f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1f500 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
1f510 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1f520 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
1f530 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73 71 6c  rnalOff;.    sql
1f540 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
1f550 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
1f560 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
1f570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f580 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1f590 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1f5a0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
1f5b0 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
1f5c0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
1f5d0 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
1f5e0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
1f5f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1f600 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
1f610 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
1f620 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
1f630 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
1f640 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
1f650 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
1f660 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
1f670 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
1f680 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
1f690 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1f6a0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
1f6b0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
1f6c0 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
1f6d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1f6e0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1f6f0 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
1f700 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
1f710 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
1f720 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1f730 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
1f740 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
1f750 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1f760 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
1f770 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
1f780 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
1f790 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
1f7a0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1f7b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f7c0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
1f7d0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
1f7e0 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
1f7f0 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
1f800 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
1f810 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
1f820 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
1f830 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
1f840 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
1f850 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
1f860 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
1f870 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
1f880 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
1f890 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
1f8a0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
1f8b0 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
1f8c0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1f8d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1f8e0 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
1f8f0 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
1f900 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
1f910 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
1f920 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
1f930 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
1f940 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1f950 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1f960 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
1f970 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
1f980 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1f990 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
1f9a0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1f9b0 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
1f9c0 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
1f9d0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1f9e0 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
1f9f0 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
1fa00 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1fa10 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
1fa20 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
1fa30 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
1fa40 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
1fa50 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
1fa60 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
1fa70 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
1fa80 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
1fa90 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1faa0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
1fab0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
1fac0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fad0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1fae0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1faf0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
1fb00 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1fb10 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
1fb20 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
1fb30 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
1fb40 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1fb50 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1fb60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1fb70 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
1fb80 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
1fb90 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1fbc0 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fbf0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1fc00 20 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73 74   if( NEVER(pList
1fc10 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51  ==0) ) return SQ
1fc20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
1fc30 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
1fc40 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
1fc50 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
1fc60 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
1fc70 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
1fc80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
1fc90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1fca0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
1fcb0 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
1fcc0 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
1fcd0 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
1fce0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
1fcf0 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
1fd00 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
1fd10 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
1fd20 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
1fd30 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
1fd40 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
1fd50 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
1fd60 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
1fd70 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
1fd80 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
1fd90 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
1fda0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fdb0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
1fdc0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
1fdd0 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
1fde0 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
1fdf0 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
1fe00 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
1fe10 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
1fe20 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
1fe30 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
1fe40 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
1fe50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
1fe60 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
1fe70 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
1fe80 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
1fe90 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1fea0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
1feb0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
1fec0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
1fed0 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
1fee0 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
1fef0 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
1ff00 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
1ff10 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
1ff20 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
1ff30 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
1ff40 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1ff50 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
1ff60 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
1ff70 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
1ff80 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1ff90 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
1ffa0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
1ffb0 67 65 72 55 73 65 57 61 6c 28 70 4c 69 73 74 2d  gerUseWal(pList-
1ffc0 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  >pPager) );.  as
1ffd0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1ffe0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1fff0 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  VED );.  rc = pa
20000 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
20010 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
20020 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20  VE_LOCK);..  /* 
20030 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
20040 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
20050 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
20060 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
20070 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
20080 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
20090 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
200a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
200b0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
200c0 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
200d0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
200e0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
200f0 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
20100 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
20110 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
20120 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20130 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
20140 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
20150 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
20160 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
20170 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
20180 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
20190 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68  ..  /* Before th
201a0 65 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67  e first write, g
201b0 69 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69  ive the VFS a hi
201c0 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66  nt of what the f
201d0 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73  inal.  ** file s
201e0 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a  ize will be..  *
201f0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
20200 64 62 53 69 7a 65 20 3e 20 28 70 50 61 67 65 72  dbSize > (pPager
20210 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2b 31 29 20  ->dbOrigSize+1) 
20220 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
20230 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  ->fd) ){.    sql
20240 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
20250 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
20260 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
20270 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
20280 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
20290 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
202a0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
202b0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
202c0 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 7d  T, &szFile);.  }
202d0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
202e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
202f0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
20300 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
20310 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
20320 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
20330 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
20340 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
20350 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
20360 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
20370 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
20380 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
20390 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
203a0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
203b0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
203c0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
203d0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
203e0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
203f0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
20400 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
20410 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
20420 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
20430 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
20440 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
20450 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
20460 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
20470 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
20480 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
20490 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
204a0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
204b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
204c0 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
204d0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
204e0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
204f0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
20500 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
20510 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
20520 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
20530 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
20540 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
20570 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
20580 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
20590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
205a0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
205b0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
205c0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
205d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
205e0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
205f0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
20600 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
20610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20620 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
20630 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
20640 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
20650 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
20660 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
20670 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
20680 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
20690 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
206a0 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
206b0 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
206c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
206d0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
206e0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
206f0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
20700 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
20710 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
20720 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
20730 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
20740 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
20750 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
20760 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
20770 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
20780 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
20790 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
207a0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
207b0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
207c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
207d0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
207e0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
207f0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
20800 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
20810 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
20820 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
20830 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
20840 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
20850 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
20860 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
20870 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
20880 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
20890 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
208a0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
208d0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
208e0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
208f0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
20900 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
20910 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
20920 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
20930 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
20940 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
20950 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
20960 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
20970 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20980 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
20990 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
209a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
209b0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
209c0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
209d0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
209e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
209f0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
20a00 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
20a10 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
20a20 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
20a30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72  ;.}../*.** Ensur
20a50 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a  e that the sub-j
20a60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
20a70 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c  pen. If it is al
20a80 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73  ready open, this
20a90 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73   .** function is
20aa0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
20ab0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
20ac0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
20ad0 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
20ae0 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
20af0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
20b00 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
20b10 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
20b20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
20b30 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c  sOpen() .** fail
20b40 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
20b50 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
20b60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20b70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20b80 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f  E_OK;.  if( !isO
20b90 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
20ba0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ) ){.    if( pPa
20bb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20bc0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
20bd0 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50  ODE_MEMORY || pP
20be0 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
20bf0 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ry ){.      sqli
20c00 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
20c10 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  n(pPager->sjfd);
20c20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20c30 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
20c40 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
20c50 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54  ger->sjfd, SQLIT
20c60 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
20c70 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  L);.    }.  }.  
20c80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20c90 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
20ca0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
20cb0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
20cc0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
20cd0 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20  journal. .** It 
20ce0 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
20cf0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
20d00 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72 65   use subjRequire
20d10 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b  sPage() to check
20d20 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20   .** that it is 
20d30 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  really required 
20d40 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
20d50 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
20d60 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
20d70 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63  l, set the bit c
20d80 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
20d90 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65  pPg->pgno in the
20da0 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20   bitvecs.** for 
20db0 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
20dc0 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nts before retur
20dd0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ning..**.** This
20de0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
20df0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  s SQLITE_OK if e
20e00 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
20e10 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a  cessful, an IO.*
20e20 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  * error code if 
20e30 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77  the attempt to w
20e40 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d  rite to the sub-
20e50 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  journal fails, o
20e60 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  r .** SQLITE_NOM
20e70 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
20e80 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69  ails while setti
20e90 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61  ng a bit in a sa
20ea0 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65  vepoint.** bitve
20eb0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
20ec0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
20ed0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
20ee0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20ef0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
20f00 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
20f10 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
20f20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
20f30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
20f40 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70  FF ){..    /* Op
20f50 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
20f60 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f  al, if it has no
20f70 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  t already been o
20f80 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73  pened */.    ass
20f90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
20fa0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
20fb0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
20fc0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61  ager->jfd) || pa
20fd0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20fe0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
20ff0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
21000 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  sjfd) || pPager-
21010 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20  >nSubRec==0 );. 
21020 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
21030 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
21040 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
21050 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
21060 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
21070 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
21080 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
21090 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
210a0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
210b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
210c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   sub-journal was
210d0 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66   opened successf
210e0 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72  ully (or was alr
210f0 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20  eady open),.    
21100 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75  ** write the jou
21110 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f  rnal record into
21120 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20   the file.  */. 
21130 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f  E_OK ){.      vo
21150 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
21160 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36  >pData;.      i6
21170 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
21180 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
21190 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
211a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
211b0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
211c0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
211d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
211e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
211f0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
21200 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
21210 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
21220 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
21230 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
21240 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
21250 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
21260 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
21270 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
21280 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
21290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
212a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
212b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
212c0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
212d0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
212e0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
212f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21300 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
21310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
21320 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
21330 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21340 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
21350 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
21360 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
21370 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
21380 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
21390 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
213a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
213b0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
213c0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
213d0 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
213e0 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
213f0 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
21400 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
21410 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
21420 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
21430 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
21440 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
21450 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
21460 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
21470 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
21480 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
21490 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
214a0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
214b0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
214c0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
214d0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
214e0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
214f0 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
21500 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
21510 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
21520 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
21530 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
21540 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
21550 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
21560 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
21570 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
21580 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
21590 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
215a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
215b0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
215c0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
215d0 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
215e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
215f0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
21600 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
21610 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
21620 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
21630 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
21640 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
21650 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
21660 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
21670 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
21680 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
21690 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
216a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
216b0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
216c0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
216d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
216e0 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
216f0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
21700 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
21710 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
21720 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
21730 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
21740 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21750 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
21760 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
21770 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
21780 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
21790 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
217a0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
217b0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
217c0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
217d0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
217e0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
217f0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
21800 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
21810 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21820 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
21830 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
21840 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
21850 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  og. */.    if( s
21860 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
21870 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72  pPg) ){ .      r
21880 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
21890 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a  ge(pPg); .    }.
218a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
218b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
218c0 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
218d0 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
218e0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 0, 0);.    }.
218f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
21900 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  The doNotSync fl
21910 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65  ag is set by the
21920 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21930 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68  te() function wh
21940 69 6c 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73  ile it.    ** is
21950 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73   journalling a s
21960 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  et of two or mor
21970 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
21980 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64   that are stored
21990 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73  .    ** on the s
219a0 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  ame disk sector.
219b0 20 53 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75   Syncing the jou
219c0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rnal is not allo
219d0 77 65 64 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  wed while.    **
219e0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
219f0 6e 67 20 61 73 20 69 74 20 69 73 20 69 6d 70 6f  ng as it is impo
21a00 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d  rtant that all m
21a10 65 6d 62 65 72 73 20 6f 66 20 73 75 63 68 20 61  embers of such a
21a20 0a 20 20 20 20 2a 2a 20 73 65 74 20 6f 66 20 70  .    ** set of p
21a30 61 67 65 73 20 61 72 65 20 73 79 6e 63 65 64 20  ages are synced 
21a40 74 6f 20 64 69 73 6b 20 74 6f 67 65 74 68 65 72  to disk together
21a50 2e 20 53 6f 2c 20 69 66 20 74 68 65 20 70 61 67  . So, if the pag
21a60 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  e this function.
21a70 20 20 20 20 2a 2a 20 69 73 20 74 72 79 69 6e 67      ** is trying
21a80 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77   to make clean w
21a90 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
21aa0 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64 20 74  urnal sync and t
21ab0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 20  he doNotSync.   
21ac0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
21ad0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
21ae0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
21af0 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  The pcache layer
21b00 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6a 75 73   will.    ** jus
21b10 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65  t have to go ahe
21b20 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ad and allocate 
21b30 61 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65  a new page buffe
21b40 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  r instead of.   
21b50 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e   ** reusing pPg.
21b60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
21b70 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65  imilarly, if the
21b80 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
21b90 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
21ba0 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
21bb0 6f 74 0a 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  ot.    ** try to
21bc0 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
21bd0 6e 74 73 20 6f 66 20 70 50 67 20 74 6f 20 64 69  nts of pPg to di
21be0 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  sk..    */.    i
21bf0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
21c00 3e 65 72 72 43 6f 64 65 29 0a 20 20 20 20 20 7c  >errCode).     |
21c10 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  | (pPager->doNot
21c20 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61  Sync && pPg->fla
21c30 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
21c40 4e 43 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  NC).    ){.     
21c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21c60 4b 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  K;.    }.  .    
21c70 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
21c80 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
21c90 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
21ca0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
21cb0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
21cc0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
21cd0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
21ce0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21cf0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
21d00 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20  ->fullSync && . 
21d10 20 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d         !(pPager-
21d20 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
21d30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21d40 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20  MEMORY) &&.     
21d50 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
21d60 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
21d70 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
21d80 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
21d90 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20  E_APPEND).      
21da0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
21db0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
21dc0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
21dd0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
21de0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21df0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
21e00 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
21e10 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61   this page is la
21e20 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  rger than the cu
21e30 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20  rrent size of.  
21e40 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
21e50 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
21e60 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
21e70 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
21e80 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68  urnal..    ** Th
21e90 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68  is is because th
21ea0 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  e call to pager_
21eb0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29  write_pagelist()
21ec0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
21ed0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
21ee0 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68  write data to th
21ef0 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  e file in this c
21f00 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ase..    **.    
21f10 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
21f20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
21f30 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
21f40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45    **.    **   BE
21f50 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  GIN;.    **     
21f60 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e  <journal page X>
21f70 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  .    **     <mod
21f80 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20  ify page X>.    
21f90 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
21fa0 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20   sp;.    **     
21fb0 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61    <shrink databa
21fc0 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67  se file to Y pag
21fd0 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  es>.    **      
21fe0 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
21ff0 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X).    **     
22000 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
22010 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
22020 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
22030 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
22040 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
22050 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
22060 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  en.    ** out to
22070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22080 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20  le, but will be 
22090 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65  dropped from the
220a0 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20   cache. Then,.  
220b0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
220c0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
220d0 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
220e0 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
220f0 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64  ll read.    ** d
22100 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
22110 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
22120 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70   will be the cop
22130 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69  y of page X as i
22140 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65  t.    ** was whe
22150 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
22160 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61  n started, not a
22170 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53  s it was when "S
22180 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20  AVEPOINT sp".   
22190 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
221a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
221b0 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
221c0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
221d0 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61  rent data for pa
221e0 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20  ge X into the . 
221f0 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61     ** sub-journa
22200 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
22210 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
22220 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
22230 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   it will.    ** 
22240 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
22250 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
22260 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
22270 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20  ACK TO sp" is . 
22280 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a     ** executed..
22290 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e      */.    if( N
222a0 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63  EVER(.        rc
222b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
222c0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
222d0 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
222e0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
222f0 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20  .    ) ){.      
22300 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
22310 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
22320 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
22330 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22340 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
22350 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22360 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
22370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22380 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22390 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
223a0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
223b0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
223c0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
223d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
223e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
223f0 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
22400 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
22410 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
22420 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
22430 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
22440 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
22450 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
22460 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
22470 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  c);.}.../*.** Al
22480 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
22490 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
224a0 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
224b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
224c0 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
224d0 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
224e0 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
224f0 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
22500 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
22510 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
22520 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
22530 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
22540 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
22550 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
22560 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
22570 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
22580 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
22590 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
225a0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
225b0 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
225c0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
225d0 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
225e0 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
225f0 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
22600 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
22610 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
22620 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
22630 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
22640 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
22650 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
22660 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
22670 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
22680 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
22690 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
226a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
226b0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
226c0 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
226d0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
226e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
226f0 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
22700 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
22710 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
22720 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
22730 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
22740 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
22750 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
22760 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
22770 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
22780 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
22790 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
227a0 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
227b0 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
227c0 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
227d0 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
227e0 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
227f0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
22800 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f  * of the PAGER_O
22810 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
22820 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
22830 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  K flags..**.** T
22840 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
22850 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
22860 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
22870 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
22880 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
22890 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
228a0 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
228b0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
228c0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
228d0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
228e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
228f0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
22900 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
22910 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
22920 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22930 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
22940 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
22950 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
22960 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
22970 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
22980 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
22990 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
229a0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
229b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
229c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
229d0 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
229e0 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
229f0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
22a00 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
22a10 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
22a20 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
22a30 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
22a40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
22a50 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
22a60 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
22a70 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
22a80 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
22a90 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
22aa0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
22ab0 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
22ac0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
22ad0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
22ae0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
22af0 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
22b00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22b10 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
22b20 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
22b30 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
22b40 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
22b50 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
22b60 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
22b70 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
22b80 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
22b90 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
22ba0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
22bb0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
22bc0 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
22bd0 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
22be0 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
22bf0 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
22c00 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
22c10 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
22c20 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
22c30 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
22c40 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22c50 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
22c60 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
22c70 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
22c80 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
22c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
22ca0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
22cb0 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
22cc0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
22cd0 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
22ce0 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
22cf0 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
22d00 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
22d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22d20 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
22d30 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
22d40 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
22d50 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
22d60 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
22d70 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
22d80 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
22d90 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
22da0 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
22db0 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
22dc0 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
22dd0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
22de0 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
22df0 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
22e00 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
22e10 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
22e20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22e30 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
22e40 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
22e50 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
22e60 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
22e70 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
22e80 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
22e90 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65  al */.  int noRe
22ea0 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
22eb0 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
22ec0 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75  OCK)!=0;  /* Tru
22ed0 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c  e to omit read-l
22ee0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  ock */.  int pca
22ef0 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
22f00 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
22f10 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
22f20 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
22f30 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a  ache */.  u16 sz
22f40 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
22f50 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
22f60 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
22f70 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   page size */.. 
22f80 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
22f90 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
22fa0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
22fb0 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
22fc0 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
22fd0 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
22fe0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
22ff0 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
23000 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
23010 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
23020 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
23030 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
23040 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
23050 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
23060 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
23070 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
23080 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
23090 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
230a0 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
230b0 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
230c0 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
230d0 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
230e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
230f0 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
23100 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
23110 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
23120 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
23130 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
23140 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
23150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
23160 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
23170 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
23180 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
23190 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
231a0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
231b0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
231c0 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
231d0 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
231e0 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
231f0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
23200 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
23210 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
23220 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
23230 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
23240 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
23250 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
23260 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
23270 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
23280 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
23290 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
232a0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
232b0 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
232c0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
232d0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
232e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
232f0 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
23300 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
23310 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
23320 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
23330 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
23340 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e  name[0] ){.    n
23350 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
23360 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
23370 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
23380 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61  qlite3Malloc(nPa
23390 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
233a0 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
233b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
233c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
233d0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
233e0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
233f0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
23400 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
23410 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
23420 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
23430 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
23440 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  = 0;.    }else.#
23450 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
23460 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
23470 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
23480 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
23490 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
234a0 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
234b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
234c0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
234d0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
234e0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
234f0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
23500 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
23510 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
23520 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
23530 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23540 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
23550 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
23560 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
23570 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
23580 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
23590 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
235a0 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
235b0 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
235c0 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
235d0 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
235e0 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
235f0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
23600 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
23610 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
23620 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
23630 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
23640 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
23650 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
23660 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
23670 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
23680 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
23690 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
236a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
236b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
236c0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
236d0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
236e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
236f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
23700 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
23710 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23720 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
23730 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
23740 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
23750 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
23760 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
23770 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
23780 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
23790 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
237a0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
237b0 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
237c0 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
237d0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
237e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
237f0 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
23810 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
23820 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
23830 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
23850 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
23860 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
23870 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
23880 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
23890 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
238a0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
238b0 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
238c0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
238d0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
238e0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
238f0 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
23900 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
23910 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
23920 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
23930 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
23940 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
23950 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
23960 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23970 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
23980 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
23990 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
239a0 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
239b0 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
239c0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
239d0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
239e0 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
239f0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
23a00 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
23a10 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
23a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
23a30 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
23a40 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
23a50 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
23a60 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
23a70 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
23a80 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
23a90 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
23aa0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
23ab0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
23ac0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  hname + 1 +     
23ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
23ae0 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
23af0 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31  Pathname + 8 + 1
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b10 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29   zJournal */.  )
23b20 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
23b30 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
23b40 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
23b50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
23b60 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
23b70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
23b80 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
23b90 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
23ba0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
23bb0 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
23bc0 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
23bd0 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
23be0 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
23bf0 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
23c00 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
23c10 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
23c20 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
23c30 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
23c40 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
23c50 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
23c60 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
23c70 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
23c80 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
23c90 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
23ca0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
23cb0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
23cc0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
23cd0 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
23ce0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
23cf0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
23d00 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
23d10 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
23d20 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
23d30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
23d40 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
23d50 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
23d60 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
23d70 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
23d80 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
23d90 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
23da0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  {.    pPager->zJ
23db0 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
23dc0 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
23dd0 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d  name + 1);.    m
23de0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
23df0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
23e00 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
23e10 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
23e20 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
23e30 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
23e40 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
23e50 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
23e60 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
23e70 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20  ournal", 8);.   
23e80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69   if( pPager->zFi
23e90 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70  lename[0]==0 ) p
23ea0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
23eb0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  0] = 0;.    sqli
23ec0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
23ed0 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
23ee0 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
23ef0 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
23f00 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
23f10 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
23f20 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
23f30 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
23f40 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
23f50 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
23f60 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
23f90 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
23fa0 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
23fb0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
23fc0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
23fd0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
23fe0 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
23ff0 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  );.    readOnly 
24000 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
24010 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
24020 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
24030 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
24040 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
24050 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
24060 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
24070 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
24080 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
24090 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
240a0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
240b0 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
240c0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
240d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
240e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
240f0 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
24100 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
24110 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
24120 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
24130 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
24140 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
24150 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
24160 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
24170 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
24180 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
24190 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
241a0 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
241b0 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65  y ){.      setSe
241c0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
241d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53  ;.      assert(S
241e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
241f0 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
24200 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
24210 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
24220 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
24230 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
24240 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
24250 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
24260 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
24270 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
24280 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
24290 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
242a0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
242b0 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
242c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
242d0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31  szPageDflt = (u1
242e0 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  6)pPager->sector
242f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
24300 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
24310 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
24320 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
24330 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
24340 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
24350 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
24360 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
24370 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
24380 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
24390 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
243a0 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
243b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
243c0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
243d0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
243e0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
243f0 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
24400 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
24410 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
24420 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
24430 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
24440 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
24450 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
24460 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
24470 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
24480 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
24490 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
244a0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
244b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
244c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
244d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
244e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
244f0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
24500 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
24510 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
24520 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
24530 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
24540 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
24550 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
24560 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
24570 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
24580 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
24590 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
245a0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
245b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
245c0 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
245d0 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
245e0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
245f0 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
24600 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
24610 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
24620 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
24630 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
24640 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
24650 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
24660 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
24670 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20  journal..    */ 
24680 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
24690 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
246a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
246b0 4c 55 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64  LUSIVE;.    read
246c0 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
246d0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
246e0 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
246f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24700 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
24710 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
24720 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
24730 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
24740 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
24750 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
24760 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
24770 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
24780 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24790 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
247a0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
247b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
247c0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
247d0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
247e0 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
247f0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
24800 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
24810 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
24820 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65  or occurred in e
24830 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
24840 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
24850 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
24860 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
24870 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
24880 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
24890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
248a0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
248b0 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20  TmpSpace );.    
248c0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
248d0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
248e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
248f0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
24900 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
24910 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
24920 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
24930 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
24940 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72  <1000 );.  nExtr
24950 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
24960 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
24970 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
24980 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
24990 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
249a0 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
249b0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
249c0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
249d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
249e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
249f0 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
24a00 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
24a10 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
24a20 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
24a30 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
24a40 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
24a50 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
24a60 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
24a70 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
24a80 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
24a90 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
24aa0 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
24ab0 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
24ac0 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
24ad0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
24ae0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
24af0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
24b00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
24b10 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
24b20 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
24b30 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f  = (u8)memDb;.  /
24b40 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
24b50 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
24b60 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
24b70 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
24b80 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
24b90 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
24ba0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
24bb0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
24bc0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
24bd0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
24be0 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
24bf0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
24c00 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
24c10 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
24c20 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
24c30 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
24c40 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
24c50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
24c60 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
24c70 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
24c80 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
24c90 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
24ca0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
24cb0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
24cc0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
24cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
24ce0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
24cf0 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
24d00 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
24d10 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
24d20 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
24d30 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
24d40 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
24d50 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
24d60 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
24d70 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
24d80 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
24d90 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
24da0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
24db0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73   */.  assert( us
24dc0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
24dd0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
24de0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
24df0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
24e00 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
24e10 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72  ullSync = pPager
24e20 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20  ->noSync ?0:1;. 
24e30 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
24e40 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
24e50 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
24e60 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
24e70 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
24e80 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
24e90 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
24ea0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
24eb0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
24ec0 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
24ed0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
24ee0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
24ef0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
24f00 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
24f10 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
24f20 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
24f30 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
24f40 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
24f50 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
24f60 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
24f70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
24f80 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
24f90 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
24fa0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
24fb0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
24fc0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
24fd0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
24fe0 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
24ff0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
25000 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
25010 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
25020 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
25030 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
25040 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
25050 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
25060 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
25070 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
25080 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70  ash)); */..  *pp
25090 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
250a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
250b0 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  OK;.}..../*.** T
250c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
250d0 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
250e0 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
250f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
25100 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
25110 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
25120 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
25130 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
25140 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
25150 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
25160 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
25170 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
25180 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
25190 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
251a0 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
251b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
251c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
251d0 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
251e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
251f0 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
25200 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
25210 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
25220 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
25230 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
25240 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
25250 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
25260 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
25270 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25280 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
25290 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
252a0 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
252b0 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
252c0 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
252d0 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
252e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
252f0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
25300 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
25310 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
25320 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
25330 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
25340 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
25350 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
25360 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
25370 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
25380 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
25390 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
253a0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
253b0 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
253c0 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
253d0 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
253e0 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
253f0 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
25400 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
25410 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
25420 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
25430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
25440 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
25450 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
25460 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
25470 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
25480 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
25490 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
254a0 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
254b0 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
254c0 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
254d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
254e0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
254f0 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
25500 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
25510 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
25520 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
25530 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
25540 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
25550 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
25560 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
25570 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
25580 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
25590 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
255a0 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
255b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
255c0 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
255d0 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
255e0 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
255f0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25600 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
25610 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
25620 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
25630 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
25640 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
25650 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
25660 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
25670 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
25680 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
25690 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
256a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
256b0 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
256c0 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
256d0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
256e0 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
256f0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
25700 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
25710 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
25720 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
25730 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
25740 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
25750 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
25760 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  s;.  int rc;    
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25780 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
25790 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
257a0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
257b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
257c0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
257d0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20  s present */..  
257e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
257f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
25800 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
25810 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  l );.  assert( i
25820 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
25830 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
25840 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
25850 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
25860 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c   pPager->state <
25870 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  = PAGER_SHARED )
25880 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
25890 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
258a0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
258b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
258c0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
258d0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
258e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
258f0 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
25900 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
25910 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
25920 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
25930 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
25940 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
25950 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
25960 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
25970 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
25980 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
25990 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
259a0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
259b0 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
259c0 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
259d0 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
259e0 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
259f0 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
25a00 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
25a10 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
25a20 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
25a30 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
25a40 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
25a50 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
25a60 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
25a70 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
25a80 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
25a90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
25aa0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
25ab0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
25ac0 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
25ad0 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
25ae0 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
25af0 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
25b00 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
25b10 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
25b20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
25b30 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
25b40 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
25b50 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
25b60 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
25b70 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
25b80 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
25b90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25ba0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
25bb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
25bc0 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  e;..      /* Che
25bd0 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
25be0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25bf0 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
25c00 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
25c10 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
25c20 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
25c30 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
25c40 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
25c50 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
25c60 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
25c70 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
25c80 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
25c90 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
25ca0 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
25cb0 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
25cc0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
25cd0 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
25ce0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
25cf0 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
25d00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25d10 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
25d20 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
25d30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
25d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d50 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
25d60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
25d70 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
25d80 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
25d90 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25da0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
25db0 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
25dc0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25de0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
25df0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
25e00 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
25e10 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
25e20 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
25e30 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
25e40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25e50 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
25e60 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
25e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25e80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
25e90 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
25ea0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
25eb0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
25ec0 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
25ed0 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
25ee0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
25ef0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
25f00 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
25f10 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
25f20 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
25f30 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
25f40 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
25f50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
25f60 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
25f70 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
25f80 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
25f90 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
25fa0 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
25fb0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
25fc0 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
25fd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25fe0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
25ff0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
26000 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
26010 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
26020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26030 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
26040 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
26050 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
26060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26080 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
26090 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
260a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
260b0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
260c0 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
260d0 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
260e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
260f0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
26100 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
26110 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26140 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
26150 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
26160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  );.            *
26170 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74  pExists = (first
26180 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
26190 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
261a0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
261b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
261c0 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65  If we cannot ope
261d0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
261e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f  ournal file in o
261f0 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20  rder to see if. 
26200 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
26210 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  s has a zero hea
26220 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
26230 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
26240 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
26250 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
26260 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
26270 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
26280 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
26290 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
262a0 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
262b0 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
262c0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
262d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
262e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
262f0 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
26300 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
26310 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
26320 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
26330 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
26340 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
26350 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
26360 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
26370 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
26380 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
26390 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
263a0 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
263b0 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
263c0 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
263d0 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
263e0 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
263f0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
26400 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
26410 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
26420 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
26430 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26450 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
26460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26470 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26480 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
26490 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
264a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
264b0 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
264c0 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
264d0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
264e0 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
264f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
26500 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
26510 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
26520 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
26530 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
26540 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
26550 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26560 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
26570 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
26580 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
26590 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
265a0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
265b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
265c0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
265d0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
265e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
265f0 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
26600 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
26610 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
26620 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
26630 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
26640 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
26650 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
26660 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
26670 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
26680 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
26690 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
266a0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
266b0 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
266c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
266d0 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
266e0 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
266f0 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
26700 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
26710 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
26720 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
26730 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
26740 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
26750 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
26760 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
26770 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
26780 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26790 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
267a0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
267b0 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
267c0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
267d0 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
267e0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
267f0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
26800 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
26810 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
26820 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
26830 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
26840 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
26850 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
26860 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
26870 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
26880 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
26890 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
268a0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
268b0 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
268c0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
268d0 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
268e0 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
268f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
26900 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
26910 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73  he operation des
26920 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62  cribed by (2) ab
26930 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ove is not attem
26940 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65  pted, and if the
26950 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
26960 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
26970 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
26980 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20  _FULL when this 
26990 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68  is called,.** th
269a0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
269b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
269c0 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d  rned. It is perm
269d0 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68  itted to read th
269e0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68  e.** database wh
269f0 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c  en in SQLITE_FUL
26a00 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  L error state..*
26a10 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
26a20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
26a30 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
26a40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26a50 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20  ed. If an.** IO 
26a60 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
26a70 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
26a80 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
26a90 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
26aa0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72  nal.** file or r
26ab0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
26ac0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
26ad0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
26ae0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
26af0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
26b00 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
26b10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
26b20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
26b50 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
26b60 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
26b70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26b80 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20  recovering from 
26b90 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  error state */..
26ba0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
26bb0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
26bc0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
26bd0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
26be0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
26bf0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 2a  standing pages *
26c00 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
26c10 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
26c20 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
26c30 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e  e)==0 );.  if( N
26c40 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50  EVER(MEMDB && pP
26c50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
26c60 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  { return pPager-
26c70 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f  >errCode; }..  /
26c80 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
26c90 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  se is in an erro
26ca0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
26cb0 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  a chance to clea
26cc0 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
26cd0 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
26ce0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
26cf0 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f  ger-cache and ro
26d00 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20  llback.  ** any 
26d10 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74  hot journal in t
26d20 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a  he file-system..
26d30 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
26d40 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
26d50 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
26d60 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
26d70 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b  ger->zJournal ){
26d80 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65  .      isErrorRe
26d90 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  set = 1;.    }. 
26da0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
26db0 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
26dc0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
26dd0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
26de0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
26df0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
26e00 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
26e10 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
26e20 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ager);.  }else i
26e30 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
26e40 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
26e50 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29  | isErrorReset )
26e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
26e70 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
26e80 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
26e90 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72     int isHotJour
26ea0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  nal = 0;.    ass
26eb0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
26ec0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26ed0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
26ee0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
26ef0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
26f00 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
26f10 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ck ){.      asse
26f20 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  rt( pPager->read
26f30 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50  Only );.      pP
26f40 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
26f50 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
26f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
26f70 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
26f80 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
26f90 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
26fa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26fb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
26fc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
26fd0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
26fe0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  K );.        ret
26ff0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
27000 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
27010 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
27020 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27030 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
27040 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
27050 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
27060 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
27070 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
27080 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
27090 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
270a0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
270b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
270c0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
270d0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
270e0 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
270f0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
27100 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27110 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44   <= PAGER_SHARED
27120 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   );.      rc = h
27130 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
27140 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e  ger, &isHotJourn
27150 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
27160 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27170 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
27180 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
27190 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72   }.    if( isErr
271a0 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74  orReset || isHot
271b0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
271c0 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
271d0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
271e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
271f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
27200 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
27210 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
27220 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
27230 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
27240 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
27250 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
27260 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
27270 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
27280 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
27290 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
272a0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
272b0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
272c0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
272d0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
272e0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
272f0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
27300 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
27310 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
27320 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
27330 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
27340 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
27350 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
27360 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
27370 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
27380 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
27390 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
273a0 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
273b0 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
273c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
273d0 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
273e0 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
273f0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
27400 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
27410 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
27420 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
27430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
27440 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
27450 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
27460 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f  state<EXCLUSIVE_
27470 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
27480 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
27490 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
274a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
274b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
274c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
274d0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
274e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
274f0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
27500 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
27510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
27520 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
27530 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
27540 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
27550 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
27560 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
27570 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
27580 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
27590 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
275a0 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
275b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
275c0 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
275d0 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  en and.      ** 
275e0 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
275f0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
27600 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
27610 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
27620 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
27630 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
27640 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
27650 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
27660 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  uires.      ** a
27670 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65   read/write file
27680 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a   handle..      *
27690 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
276a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
276b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
276c0 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  res;.        rc 
276d0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
276e0 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a  s(pVfs,pPager->z
276f0 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41  Journal,SQLITE_A
27700 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65  CCESS_EXISTS,&re
27710 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
27720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27730 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27740 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
27750 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
27760 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
27770 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
27780 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
27790 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
277a0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
277b0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
277c0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
277d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
277e0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
277f0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
27800 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
27810 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
27820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
27840 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27850 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
27860 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27870 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
27880 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
27890 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
278a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
278b0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
278c0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
278d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
278e0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
278f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27910 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
27920 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
27930 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
27940 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
27950 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e .            *
27960 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
27970 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
27980 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
27990 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
279a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
279b0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
279c0 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
279d0 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
279e0 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20  Or, it .        
279f0 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
27a00 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
27a10 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
27a20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
27a30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
27a40 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
27a50 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
27a60 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
27a70 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20   exist.  */.    
27a80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
27a90 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
27aa0 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
27ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27ac0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27ad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27af0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
27b00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52     }..      /* R
27b10 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eset the journal
27b20 20 73 74 61 74 75 73 20 66 69 65 6c 64 73 20 74   status fields t
27b30 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  o indicates that
27b40 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20 20   we have no.    
27b50 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
27b60 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74 69  urnal at this ti
27b70 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  me. */.      pPa
27b80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
27b90 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ted = 0;.      p
27ba0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27bb0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
27bc0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
27bd0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
27be0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
27bf0 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b  ;. .      /* Mak
27c00 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
27c10 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
27c20 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
27c30 20 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50   */. .      /* P
27c40 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
27c50 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
27c60 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
27c70 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
27c80 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
27c90 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
27ca0 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
27cb0 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
27cc0 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
27cd0 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
27ce0 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
27cf0 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
27d00 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
27d10 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
27d20 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
27d30 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
27d40 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
27d50 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
27d60 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
27d70 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
27d80 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
27d90 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
27da0 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
27db0 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
27dc0 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
27dd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
27de0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
27df0 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
27e00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
27e10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27e20 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
27e30 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
27e40 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
27e50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
27e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27e70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
27e80 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
27e90 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
27ea0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
27eb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27ec0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
27ed0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
27ee0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
27ef0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
27f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27f10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
27f20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
27f30 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
27f40 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
27f50 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
27f60 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
27f70 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
27f80 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
27f90 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
27fa0 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
27fb0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
27fc0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
27fd0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
27fe0 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
27ff0 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
28000 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
28010 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
28020 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
28030 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
28040 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
28050 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
28060 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
28070 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
28080 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
28090 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
280a0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
280b0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
280c0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
280d0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
280e0 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
280f0 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
28100 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
28110 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
28120 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
28130 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
28140 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
28150 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
28160 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
28170 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
28180 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
28190 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
281a0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
281b0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
281c0 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
281d0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
281e0 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
281f0 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
28200 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
28210 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
28220 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
28230 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
28240 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
28250 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
28260 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
28270 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
28280 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
28290 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
282a0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
282b0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
282c0 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
282d0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
282e0 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
282f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  /.      int nPag
28300 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  e;.      char db
28310 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
28320 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
28330 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs)];.      sqli
28340 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
28350 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
28360 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
28370 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
28380 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
28390 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
283a0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
283b0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
283c0 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
283d0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
283e0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
283f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
28400 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
28410 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28420 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
28430 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
28440 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
28450 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
28460 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28480 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
28490 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
284a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
284b0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
284c0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
284d0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
284e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
284f0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
28500 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
28510 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
28520 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
28530 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
28540 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
28550 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28570 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
28580 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  | pPager->state=
28590 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
285a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
285b0 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
285c0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
285d0 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
285e0 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
285f0 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
28600 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
28610 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
28620 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
28630 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
28640 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
28650 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ent(pPager);.  }
28660 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
28670 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28680 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
28690 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
286a0 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
286b0 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
286c0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
286d0 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
286e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
286f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28700 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
28710 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
28720 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
28730 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
28740 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
28750 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
28760 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
28770 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
28780 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
28790 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
287a0 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
287b0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
287c0 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
287d0 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
287e0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
287f0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
28800 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
28810 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
28820 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
28830 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
28840 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
28850 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
28860 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
28870 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
28880 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21  he)==0).   && (!
28890 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
288a0 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
288b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
288c0 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
288d0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
288e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
288f0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
28900 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
28910 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
28920 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
28930 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
28940 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
28950 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
28960 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
28970 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
28980 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
28990 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
289a0 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
289b0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
289c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
289d0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
289e0 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
289f0 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
28a00 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
28a10 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
28a20 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
28a30 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
28a40 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
28a50 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
28a60 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
28a70 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
28a80 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
28a90 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
28aa0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
28ab0 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
28ac0 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
28ad0 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
28ae0 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
28af0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
28b00 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
28b10 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
28b20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
28b30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
28b40 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
28b50 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
28b60 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
28b70 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
28b80 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
28b90 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
28ba0 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
28bb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
28bc0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
28bd0 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
28be0 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
28bf0 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
28c00 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
28c10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
28c20 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
28c30 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
28c40 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
28c50 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
28c60 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
28c70 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
28c80 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
28c90 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
28ca0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
28cb0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
28cc0 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
28cd0 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
28ce0 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
28cf0 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
28d00 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
28d10 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
28d20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
28d30 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
28d40 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
28d50 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
28d60 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
28d70 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
28d80 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
28d90 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
28da0 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
28db0 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
28dc0 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
28dd0 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
28de0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
28df0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
28e00 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
28e10 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
28e20 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
28e30 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
28e40 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
28e50 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
28e60 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
28e70 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
28e80 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
28e90 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
28ea0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
28eb0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
28ec0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
28ed0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
28ee0 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
28ef0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
28f00 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
28f10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
28f20 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
28f30 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
28f40 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
28f50 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
28f60 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
28f70 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
28f80 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
28f90 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
28fa0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
28fb0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
28fc0 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
28fd0 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
28fe0 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
28ff0 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
29000 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
29010 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
29020 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
29030 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
29040 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
29050 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
29060 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
29070 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
29080 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
29090 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
290a0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
290b0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
290c0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
290d0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
290e0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
290f0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
29100 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
29110 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
29120 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
29130 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
29140 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
29150 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
29160 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
29170 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
29180 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
29190 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
291a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
291b0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
291c0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
291d0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
291e0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
291f0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
29200 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
29210 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
29220 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
29230 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
29240 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
29250 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
29260 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
29270 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
29280 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
29290 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
292a0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
292b0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
292c0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
292d0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
292e0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
292f0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
29300 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
29310 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
29320 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
29330 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29340 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
29350 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
29360 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
29370 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
29380 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
29390 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
293a0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
293b0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
293c0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
293d0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
293e0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
293f0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
29400 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
29410 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
29420 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
29430 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
29440 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29450 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c  >state>PAGER_UNL
29460 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  OCK );..  if( pg
29470 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
29480 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
29490 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
294a0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
294b0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
294c0 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
294d0 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
294e0 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
294f0 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
29500 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
29510 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
29520 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
29530 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
29540 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
29550 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
29560 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
29570 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
29580 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
29590 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
295a0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
295b0 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
295c0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
295d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
295e0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
295f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
29600 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
29610 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
29620 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
29630 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
29640 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
29650 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
29660 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
29670 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
29680 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
29690 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
296a0 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
296b0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
296c0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
296d0 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
296e0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
296f0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
29700 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
29710 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
29720 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
29730 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
29740 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
29750 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
29760 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
29770 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
29780 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
29790 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
297a0 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
297b0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
297c0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
297d0 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
297e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
297f0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
29800 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
29810 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
29820 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   );.    PAGER_IN
29830 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
29840 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
29850 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
29860 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
29870 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
29880 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
29890 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
298a0 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
298b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
298c0 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
298d0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
298e0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
298f0 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
29900 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  e;.    pPg->pPag
29910 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
29920 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
29930 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
29940 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
29950 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
29960 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
29970 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
29980 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
29990 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
299a0 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
299b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
299c0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
299d0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
299e0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
299f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
29a00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29a10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
29a20 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
29a30 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
29a40 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29a50 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
29a60 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Max);.    if( rc
29a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29a80 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
29a90 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
29aa0 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
29ab0 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70  B || nMax<(int)p
29ac0 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
29ad0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
29ae0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
29af0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
29b00 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
29b10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29b20 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
29b30 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
29b40 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
29b50 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
29b60 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
29b70 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
29b80 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
29b90 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
29ba0 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
29bb0 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
29bc0 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
29bd0 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
29be0 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
29bf0 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
29c00 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
29c10 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
29c20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
29c30 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
29c40 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
29c50 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
29c60 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
29c70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
29c80 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
29c90 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
29ca0 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
29cb0 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
29cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
29cd0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
29ce0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
29cf0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
29d00 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
29d10 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
29d20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
29d30 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
29d40 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
29d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
29d60 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
29d70 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
29d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
29d90 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
29da0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
29db0 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
29dc0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
29dd0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
29de0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
29df0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
29e00 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
29e10 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
29e20 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
29e30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
29e40 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
29e50 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
29e60 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
29e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29e80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
29e90 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
29ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
29eb0 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
29ec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29ee0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
29ef0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
29f00 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
29f10 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
29f20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
29f30 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
29f40 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
29f50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
29f60 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
29f70 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
29f80 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
29f90 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
29fa0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
29fb0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
29fc0 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
29fd0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
29fe0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
29ff0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
2a000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
2a010 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
2a020 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2a030 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2a040 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
2a050 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
2a060 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
2a070 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
2a080 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
2a090 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2a0a0 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
2a0b0 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
2a0c0 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
2a0d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
2a0e0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
2a0f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2a100 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
2a110 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
2a120 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
2a130 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
2a140 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2a150 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2a160 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
2a170 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2a180 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
2a190 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2a1a0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
2a1b0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
2a1c0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
2a1d0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
2a1e0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2a1f0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
2a200 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
2a210 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
2a220 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
2a230 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
2a240 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
2a250 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
2a260 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
2a270 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
2a280 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
2a290 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
2a2a0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
2a2b0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
2a2c0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
2a2d0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
2a2e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a2f0 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
2a300 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a310 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f  ->state > PAGER_
2a320 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  UNLOCK );.  sqli
2a330 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
2a340 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
2a350 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
2a360 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
2a370 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
2a380 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2a390 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
2a3a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2a3b0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
2a3c0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
2a3d0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
2a3e0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
2a3f0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
2a400 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
2a410 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
2a420 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
2a430 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
2a440 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
2a450 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
2a460 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
2a470 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2a480 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
2a490 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
2a4a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a4b0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2a4c0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2a4d0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
2a4e0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
2a4f0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
2a500 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2a510 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2a520 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
2a530 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
2a540 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
2a550 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
2a560 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
2a570 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
2a580 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2a590 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
2a5a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2a5b0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
2a5c0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2a5d0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
2a5e0 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
2a5f0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
2a600 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
2a610 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
2a620 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
2a630 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
2a640 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
2a650 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
2a660 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
2a670 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
2a680 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
2a690 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
2a6a0 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
2a6b0 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
2a6c0 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
2a6d0 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
2a6e0 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
2a6f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
2a700 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
2a710 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
2a720 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
2a730 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
2a740 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
2a750 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
2a760 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
2a770 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
2a780 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
2a790 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
2a7a0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
2a7b0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
2a7c0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2a7d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2a7e0 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
2a7f0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
2a800 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
2a810 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
2a820 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
2a830 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2a840 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2a850 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2a860 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
2a870 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
2a880 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
2a890 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
2a8a0 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
2a8b0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2a8c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2a8d0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
2a8e0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
2a8f0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
2a900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2a910 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
2a920 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2a930 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a940 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a960 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2a970 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a9a0 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2a9b0 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
2a9c0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2a9d0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2a9e0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
2a9f0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
2aa00 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
2aa10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2aa20 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2aa30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2aa40 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2aa50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2aa60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2aa70 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2aa80 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73  ODE_OFF );.  ass
2aa90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
2aaa0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
2aab0 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
2aac0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2aad0 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
2aae0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
2aaf0 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
2ab00 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
2ab10 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
2ab20 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
2ab30 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
2ab40 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
2ab50 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
2ab60 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2ab70 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
2ab80 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
2ab90 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2aba0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30  ->dbSizeValid==0
2abb0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2abc0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2abd0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2abe0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2abf0 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
2ac00 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
2ac10 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2ac20 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  te(nPage);.  if(
2ac30 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2ac40 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  nal==0 ){.    re
2ac50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ac60 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  M;.  }..  /* Ope
2ac70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2ac80 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
2ac90 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
2aca0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2acb0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2acc0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2acd0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2ace0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2acf0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
2ad00 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
2ad10 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2ad20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ad30 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
2ad40 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
2ad50 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2ad60 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
2ad70 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
2ad80 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
2ad90 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2ada0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
2adb0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
2adc0 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
2add0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2ade0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
2adf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2ae00 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
2ae10 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2ae20 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
2ae30 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65          );.#ifde
2ae40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ae50 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2ae60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2ae70 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
2ae80 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
2ae90 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2aea0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
2aeb0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
2aec0 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
2aed0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
2aee0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2aef0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2af00 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2af10 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
2af20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2af30 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2af40 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2af50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2af60 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69  ;.  }...  /* Wri
2af70 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
2af80 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
2af90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2afa0 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74  and open .  ** t
2afb0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
2afc0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
2afd0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2afe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
2aff0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
2b000 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
2b010 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
2b020 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2b030 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
2b040 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2b050 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b060 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
2b070 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2b080 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2b090 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
2b0a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b0b0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Off = 0;.    pPa
2b0c0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
2b0d0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
2b0e0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
2b0f0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
2b100 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
2b110 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
2b120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b130 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2b140 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
2b150 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
2b160 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b170 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  al = 0;.  }.  re
2b180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b190 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
2b1a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
2b1b0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2b1c0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
2b1d0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
2b1e0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2b1f0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
2b200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b210 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2b220 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
2b230 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
2b240 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
2b250 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
2b260 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
2b270 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2b280 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
2b290 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
2b2a0 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
2b2b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
2b2c0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
2b2d0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
2b2e0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
2b2f0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
2b300 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
2b310 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
2b320 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
2b330 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74  mory file and, t
2b340 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b350 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66  is .** opened if
2b360 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   it has not been
2b370 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20   already. For a 
2b380 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20  temporary file, 
2b390 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20  the opening .** 
2b3a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b3b0 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
2b3c0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
2b3d0 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  n actual need to
2b3e0 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68   .** write to th
2b3f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a  e journal. TODO:
2b400 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70   Why handle temp
2b410 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66  orary files diff
2b420 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49  erently?.**.** I
2b430 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2b440 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72  le is opened (or
2b450 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2b460 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a  y open), then a.
2b470 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  ** journal-heade
2b480 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
2b490 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
2b4a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
2b4b0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
2b4c0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
2b4d0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
2b4e0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
2b4f0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
2b500 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
2b510 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
2b520 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
2b530 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
2b540 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
2b550 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
2b560 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
2b570 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
2b580 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2b590 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
2b5a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
2b5b0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
2b5c0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
2b5d0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
2b5e0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
2b5f0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
2b600 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
2b610 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
2b620 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
2b630 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
2b640 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2b650 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
2b660 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
2b670 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
2b680 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2b690 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
2b6a0 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
2b6b0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
2b6c0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
2b6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2b6e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2b6f0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
2b700 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  K );.  pPager->s
2b710 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
2b720 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
2b730 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
2b740 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
2b750 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
2b760 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2b770 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
2b780 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
2b790 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2b7a0 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  le );..    if( p
2b7b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2b7c0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
2b7d0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
2b7e0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
2b7f0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
2b800 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
2b810 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
2b820 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
2b830 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
2b840 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
2b850 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
2b860 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2b870 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2b880 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
2b890 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
2b8a0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
2b8b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
2b8c0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
2b8d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
2b8e0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
2b8f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
2b900 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
2b910 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  D;.        if( r
2b920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b930 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2b940 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2b950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
2b960 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
2b970 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
2b980 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2b990 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
2b9a0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
2b9b0 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
2b9c0 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
2b9d0 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
2b9e0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
2b9f0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2ba00 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2ba10 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
2ba20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
2ba30 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
2ba40 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
2ba50 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
2ba60 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
2ba70 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
2ba80 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
2ba90 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
2baa0 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
2bab0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2bac0 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
2bad0 20 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f 20   Pager.state to 
2bae0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 77  PAGER_RESERVED w
2baf0 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
2bb00 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  en.      ** tran
2bb10 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
2bb20 65 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  er to PAGER_EXCL
2bb30 55 53 49 56 45 2e 20 54 68 69 73 20 69 73 20 62  USIVE. This is b
2bb40 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
2bb50 20 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53   ** PAGER_EXCLUS
2bb60 49 56 45 20 73 74 61 74 65 20 74 68 65 20 63 6f  IVE state the co
2bb70 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
2bb80 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
2bb90 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ctions.      ** 
2bba0 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
2bbb0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
2bbc0 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
2bbd0 62 61 73 65 20 66 69 6c 65 20 61 73 20 77 65 6c  base file as wel
2bbe0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 6e  l.      ** as in
2bbf0 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
2bc00 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
2bc10 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 57  e incorrect in W
2bc20 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
2bc30 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2bc40 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
2bc50 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
2bc60 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
2bc70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bc80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2bc90 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2bca0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
2bcb0 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ze;.        pPag
2bcc0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2bcd0 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
2bce0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2bcf0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
2bd00 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
2bd10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2bd20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
2bd30 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
2bd40 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
2bd50 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2bd60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
2bd70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
2bd80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2bd90 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
2bda0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
2bdb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bdc0 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
2bdd0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
2bde0 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
2bdf0 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
2be00 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
2be10 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2be20 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
2be30 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
2be40 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
2be50 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
2be60 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
2be70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
2be80 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
2be90 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
2bea0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
2beb0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2bec0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
2bed0 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
2bee0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
2bef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bf00 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2bf10 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2bf20 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
2bf30 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
2bf40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bf50 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
2bf60 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
2bf70 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2bf80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2bf90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e    }..    /* No n
2bfa0 65 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  eed to open the 
2bfb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
2bfc0 74 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77  this time.  It w
2bfd0 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70  ill be.    ** op
2bfe0 65 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69  ened before it i
2bff0 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49  s written to.  I
2c000 66 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69  f we defer openi
2c010 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a  ng the journal,.
2c020 20 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20      ** we might 
2c030 73 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66  save the work of
2c040 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
2c050 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
2c060 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20  ion.    ** ends 
2c070 75 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70  up being a no-op
2c080 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65  ..    */.  }else
2c090 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
2c0a0 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
2c0b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
2c0c0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
2c0d0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
2c0e0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
2c0f0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
2c100 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20  mode the last.  
2c110 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
2c120 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
2c130 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
2c140 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
2c150 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
2c160 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
2c170 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
2c180 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
2c190 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
2c1a0 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
2c1b0 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63  either was trunc
2c1c0 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20  ated to 0 bytes 
2c1d0 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61  or its header wa
2c1e0 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69  s.    ** overwri
2c1f0 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tten with zeros.
2c200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2c210 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2c220 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
2c230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c240 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
2c250 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c260 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
2c270 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2c280 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2c290 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2c2a0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
2c2b0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
2c2c0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2c2d0 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
2c2e0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2c2f0 72 29 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  r)));.  if( rc!=
2c300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c310 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2c320 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
2c330 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e      /* Ignore an
2c340 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20  y IO error that 
2c350 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61  occurs within pa
2c360 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2c370 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 2a  ion(). The.    *
2c380 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  * purpose of thi
2c390 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73  s call is to res
2c3a0 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
2c3b0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
2c3c0 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 79  er.    ** sub-sy
2c3d0 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74  stem. It doesn't
2c3e0 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 6a   matter if the j
2c3f0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
2c400 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20  ot properly.    
2c410 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20  ** finalized at 
2c420 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63  this point (sinc
2c430 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61  e it is not a va
2c440 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
2c450 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f   anyway)..    */
2c460 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74  .    pager_end_t
2c470 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2c480 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r, 0);.  }.  ret
2c490 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c4a0 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
2c4b0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
2c4c0 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
2c4d0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2c4e0 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
2c4f0 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
2c500 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
2c510 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
2c520 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2c530 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
2c540 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
2c550 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
2c560 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
2c570 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
2c580 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
2c590 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
2c5a0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
2c5b0 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
2c5c0 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
2c5d0 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
2c5e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2c5f0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
2c600 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
2c610 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2c620 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2c630 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2c640 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c650 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
2c660 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
2c670 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61  led unless a tra
2c680 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2c690 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73  eady been.  ** s
2c6a0 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  tarted..  */.  a
2c6b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2c6c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2c6d0 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
2c6e0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65   an error has be
2c6f0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
2c700 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74  tected, report t
2c710 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20  he same error.  
2c720 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  ** again..  */. 
2c730 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2c740 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72  r->errCode) )  r
2c750 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2c760 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67  rCode;..  /* Hig
2c770 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
2c780 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  es never call th
2c790 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64  is function if d
2c7a0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20  atabase is not. 
2c7b0 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42   ** writable.  B
2c7c0 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c  ut check anyway,
2c7d0 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74   just for robust
2c7e0 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
2c7f0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61  EVER(pPager->rea
2c800 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  dOnly) ) return 
2c810 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20  SQLITE_PERM;..  
2c820 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2c830 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
2c840 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
2c850 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
2c860 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
2c870 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
2c880 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
2c890 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
2c8a0 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
2c8b0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
2c8c0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
2c8d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2c8e0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
2c8f0 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
2c900 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
2c910 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2c920 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2c930 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2c940 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
2c950 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
2c960 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
2c970 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
2c980 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
2c990 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
2c9a0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
2c9b0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
2c9c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
2c9d0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
2c9e0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
2c9f0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
2ca00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67     **.    ** Hig
2ca10 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
2ca20 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
2ca30 6c 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61  lready started a
2ca40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
2ca50 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73    ** which means
2ca60 20 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69   they have acqui
2ca70 72 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  red the necessar
2ca80 79 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20  y locks but the 
2ca90 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
2caa0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
2cab0 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t yet be open.. 
2cac0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2cad0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
2cae0 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67  (pPager, 0, pPag
2caf0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2cb00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2cb10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cb20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cb30 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70   }.    if( !isOp
2cb40 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2cb50 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2cb60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2cb70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2cb80 4f 46 46 20 0a 20 20 20 20 20 26 26 20 21 70 61  OFF .     && !pa
2cb90 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2cba0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  ).    ){.      a
2cbb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2cbc0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2cbd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
2cbe0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
2cbf0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2cc00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2cc10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2cc20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
2cc30 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
2cc40 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
2cc50 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
2cc60 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
2cc70 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
2cc80 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
2cc90 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
2cca0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2ccb0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
2ccc0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
2ccd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
2cce0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
2ccf0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
2cd00 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
2cd10 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
2cd20 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
2cd30 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2cd40 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
2cd50 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
2cd60 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2cd70 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
2cd80 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
2cd90 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
2cda0 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
2cdb0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2cdc0 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  2;..        /* W
2cdd0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
2cde0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
2cdf0 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
2ce00 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
2ce10 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
2ce20 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
2ce30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
2ce40 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
2ce50 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
2ce60 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
2ce70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
2ce80 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
2ce90 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
2cea0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ceb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2cec0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
2ced0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
2cee0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2cef0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
2cf00 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
2cf10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
2cf20 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
2cf30 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
2cf40 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
2cf50 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
2cf60 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2cf70 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
2cf80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2cf90 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
2cfa0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2cfb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cfc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2cfd0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2cfe0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
2cff0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d030 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f + 4);.        
2d040 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d050 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
2d060 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
2d070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2d0a0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2d0b0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2d0c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
2d0d0 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
2d0e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d0f0 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  Off += 4;.      
2d100 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
2d110 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
2d120 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
2d130 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
2d140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d150 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d160 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
2d170 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
2d180 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
2d190 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2d1a0 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
2d1b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
2d1c0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2d1d0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
2d1e0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2d1f0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
2d200 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2d210 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
2d220 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
2d230 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2d240 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
2d250 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
2d260 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
2d270 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
2d280 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
2d290 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  red while journa
2d2a0 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
2d2b0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
2d2c0 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
2d2d0 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
2d2e0 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
2d2f0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
2d300 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
2d310 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2d320 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
2d330 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
2d340 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
2d350 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
2d360 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
2d370 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
2d380 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
2d390 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2d3a0 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
2d3b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2d3c0 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
2d3d0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
2d3e0 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
2d3f0 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
2d400 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2d410 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
2d420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2d430 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
2d440 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2d450 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2d460 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2d470 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2d480 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
2d490 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e 67  occurred writing
2d4a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2d4b0 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
2d4c0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
2d4d0 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
2d4e0 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
2d4f0 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
2d500 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2d510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d520 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2d530 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2d540 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
2d550 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
2d560 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2d570 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
2d580 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d590 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
2d5a0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2d5b0 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
2d5c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2d5d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
2d5e0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
2d5f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2d600 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
2d610 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
2d620 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
2d630 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2d640 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2d650 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
2d660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d670 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d680 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
2d690 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
2d6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2d6c0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
2d6d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2d6e0 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
2d6f0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2d700 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
2d710 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
2d720 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
2d730 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2d740 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2d750 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2d760 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
2d770 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
2d780 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2d790 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2d7a0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2d7b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
2d7c0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
2d7d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
2d7e0 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
2d7f0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2d800 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
2d810 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
2d820 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
2d830 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
2d840 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
2d850 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
2d860 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
2d870 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
2d880 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
2d890 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
2d8a0 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
2d8b0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
2d8c0 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
2d8d0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
2d8e0 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
2d8f0 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
2d900 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
2d910 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2d920 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2d930 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
2d940 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2d950 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
2d960 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
2d970 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
2d980 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rn..  */.  asser
2d990 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2d9a0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
2d9b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2d9c0 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
2d9d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2d9e0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
2d9f0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
2da00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
2da10 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
2da20 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
2da30 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
2da40 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
2da50 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
2da60 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
2da70 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
2da80 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
2da90 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
2daa0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
2dab0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
2dac0 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
2dad0 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
2dae0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2daf0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
2db00 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
2db10 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
2db20 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
2db30 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
2db40 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
2db50 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
2db60 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
2db70 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
2db80 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
2db90 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
2dba0 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
2dbb0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
2dbc0 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
2dbd0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
2dbe0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2dbf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
2dc00 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2dc10 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2dc20 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
2dc30 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
2dc40 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2dc50 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
2dc60 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
2dc70 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
2dc80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2dc90 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
2dca0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
2dcb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2dcc0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
2dcd0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
2dce0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2dcf0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
2dd00 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
2dd10 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
2dd20 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
2dd30 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e  eSize);..  if( n
2dd40 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
2dd50 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
2dd60 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
2dd70 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2dd80 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
2dd90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2dda0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2ddc0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
2ddd0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
2dde0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
2ddf0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2de00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2de10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
2de20 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
2de30 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
2de40 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2de50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2de60 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2de70 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
2de80 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
2de90 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
2dea0 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
2deb0 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
2dec0 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
2ded0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
2dee0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
2def0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
2df00 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
2df10 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
2df20 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
2df30 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
2df40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2df50 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
2df60 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
2df70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2df80 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
2df90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
2dfa0 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
2dfb0 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
2dfc0 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
2dfd0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
2dfe0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
2dff0 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
2e000 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
2e010 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
2e020 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
2e030 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
2e040 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
2e050 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
2e060 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
2e070 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
2e080 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
2e090 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
2e0a0 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
2e0b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e0c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2e0d0 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
2e0e0 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
2e0f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2e100 63 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  c;.    if( pPg->
2e110 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
2e120 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
2e130 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
2e140 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
2e150 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
2e160 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
2e170 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
2e180 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
2e190 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
2e1a0 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
2e1b0 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
2e1c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2e1d0 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
2e1e0 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
2e1f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
2e200 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
2e210 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
2e220 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
2e230 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
2e240 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
2e250 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
2e260 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
2e270 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
2e280 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
2e290 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
2e2a0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2e2b0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
2e2c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
2e2d0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
2e2e0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
2e2f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e300 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2e310 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
2e320 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2e330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e340 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2e350 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
2e360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2e370 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
2e380 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2e390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e3a0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
2e3c0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
2e3d0 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
2e3e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e3f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2e400 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
2e410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e420 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2e430 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
2e440 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
2e450 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
2e460 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
2e470 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2e480 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
2e490 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2e4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e4b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2e4c0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
2e4d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2e4e0 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
2e4f0 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
2e500 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
2e510 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
2e520 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
2e530 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
2e540 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
2e550 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
2e560 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
2e570 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
2e580 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
2e590 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
2e5a0 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
2e5b0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
2e5c0 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
2e5d0 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
2e5e0 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
2e5f0 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
2e600 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
2e610 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
2e620 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2e640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2e650 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
2e660 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2e670 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
2e680 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
2e690 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
2e6a0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
2e6b0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
2e6c0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2e6d0 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
2e6e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2e6f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
2e700 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
2e710 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
2e720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e730 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2e740 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2e750 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2e760 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
2e770 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
2e780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e790 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
2e7a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
2e7b0 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
2e7c0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
2e7d0 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
2e7e0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
2e7f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2e800 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2e810 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
2e820 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
2e830 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
2e840 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
2e850 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
2e860 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
2e870 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
2e880 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
2e890 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
2e8a0 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
2e8b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
2e8c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
2e8d0 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
2e8e0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
2e8f0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2e900 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
2e910 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
2e920 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
2e930 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
2e940 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
2e950 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
2e960 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
2e970 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
2e980 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
2e990 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
2e9a0 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
2e9b0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
2e9c0 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
2e9d0 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
2e9e0 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
2e9f0 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
2ea00 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
2ea10 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
2ea20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
2ea30 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
2ea40 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
2ea50 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
2ea60 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
2ea70 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2ea80 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
2ea90 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
2eaa0 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
2eab0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
2eac0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2ead0 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
2eae0 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
2eaf0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
2eb00 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
2eb10 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
2eb20 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
2eb30 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
2eb40 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
2eb50 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
2eb60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2eb70 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
2eb80 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2eb90 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2eba0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
2ebb0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2ebc0 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
2ebd0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
2ebe0 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2ebf0 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
2ec00 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
2ec10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
2ec20 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2ec30 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
2ec40 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
2ec50 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
2ec60 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
2ec70 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
2ec80 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ITE;.#ifdef SQLI
2ec90 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2eca0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2ecb0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2ecc0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2ecd0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2ece0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2ecf0 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
2ed00 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2ed10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
2ed20 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
2ed30 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
2ed40 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2ed50 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
2ed60 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
2ed70 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
2ed80 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ager file..**.**
2ed90 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
2eda0 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
2edb0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
2edc0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
2edd0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2ede0 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
2edf0 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
2ee00 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2ee10 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
2ee20 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
2ee30 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
2ee40 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
2ee50 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2ee60 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2ee70 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
2ee80 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
2ee90 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
2eea0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2eeb0 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
2eec0 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
2eed0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2eee0 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
2eef0 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
2ef00 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
2ef10 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
2ef20 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
2ef30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
2ef40 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
2ef50 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
2ef60 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
2ef70 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
2ef80 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
2ef90 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
2efa0 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
2efb0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2efc0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2efd0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
2efe0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
2eff0 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
2f000 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2f010 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69  /* Declare and i
2f020 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61  nitialize consta
2f030 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69  nt integer 'isDi
2f040 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20  rect'. If the.  
2f050 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  ** atomic-write 
2f060 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2f070 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  enabled in this 
2f080 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69  build, then isDi
2f090 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69  rect.  ** is ini
2f0a0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
2f0b0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2f0c0 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
2f0d0 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20   parameter.  ** 
2f0e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f0f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2f100 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2f110 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
2f120 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
2f130 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  t if the atomic-
2f140 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2f150 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65  on is not.  ** e
2f160 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
2f170 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70  e time, the comp
2f180 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68  iler can omit th
2f190 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20  e tests of.  ** 
2f1a0 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77  'isDirect' below
2f1b0 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  , as well as the
2f1c0 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20   block enclosed 
2f1d0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28  in the.  ** "if(
2f1e0 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e   isDirect )" con
2f1f0 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  dition..  */.#if
2f200 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
2f210 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2f220 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
2f230 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28  MODE 0.  assert(
2f240 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
2f250 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2f260 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
2f270 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  ode);.#else.# de
2f280 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
2f290 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65   isDirectMode.#e
2f2a0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2f2b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2f2c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2f2d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2f2e0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2f2f0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
2f300 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
2f310 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
2f320 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
2f330 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2f340 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
2f350 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
2f360 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2f370 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
2f380 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
2f390 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
2f3a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f3b0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2f3c0 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
2f3d0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
2f3e0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
2f3f0 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
2f400 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2f410 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
2f420 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
2f430 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
2f440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2f450 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
2f460 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
2f470 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
2f480 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2f490 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
2f4a0 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
2f4b0 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
2f4c0 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20  ge 1 writable.  
2f4d0 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20  When not in .   
2f4e0 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   ** direct mode,
2f4f0 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79   page 1 is alway
2f500 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20  s held in cache 
2f510 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61  and hence the Pa
2f520 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20  gerGet().    ** 
2f530 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20  above is always 
2f540 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e  successful - hen
2f550 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e  ce the ALWAYS on
2f560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a   rc==SQLITE_OK..
2f570 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2f580 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41  DIRECT_MODE && A
2f590 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45  LWAYS(rc==SQLITE
2f5a0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  _OK) ){.      rc
2f5b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f5c0 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
2f5d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
2f5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f5f0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
2f600 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
2f610 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
2f620 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
2f630 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
2f640 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
2f650 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
2f660 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
2f670 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
2f680 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
2f690 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2f6a0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2f6b0 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
2f6c0 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
2f6d0 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
2f6e0 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
2f6f0 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
2f700 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
2f710 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2f720 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
2f730 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2f740 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
2f750 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20  rsion number.   
2f760 20 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20     ** is valid. 
2f770 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  */.      put32bi
2f780 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2f790 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  r->pData)+92, ch
2f7a0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
2f7b0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2f7c0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2f7d0 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
2f7e0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
2f7f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
2f800 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
2f810 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
2f820 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
2f830 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
2f840 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
2f850 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
2f860 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
2f870 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
2f880 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61  pData;.        a
2f890 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2f8a0 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
2f8b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f8c0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2f8d0 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
2f8e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
2f8f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f910 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2f920 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2f930 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  e = 1;.        }
2f940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f950 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
2f960 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2f970 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
2f980 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
2f990 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
2f9a0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
2f9b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2f9c0 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  gHdr);.  }.  ret
2f9d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f9e0 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
2f9f0 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68  file to disk. Th
2fa00 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  is is a no-op fo
2fa10 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
2fa20 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
2fa30 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
2fa40 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
2fa50 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2fa60 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20  l, or called on 
2fa70 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  a pager for whic
2fa80 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  h it is a no-op,
2fa90 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
2faa0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2fab0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
2fac0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2fad0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2fae0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2faf0 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
2fb00 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ger){.  int rc; 
2fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb30 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2fb40 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2fb50 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2fb60 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
2fb70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2fb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2fb90 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2fba0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2fbb0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
2fbc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2fbd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
2fbe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fbf0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
2fc00 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
2fc10 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
2fc20 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
2fc30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
2fc40 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
2fc50 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
2fc60 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
2fc70 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
2fc80 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
2fc90 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
2fca0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
2fcb0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
2fcc0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
2fcd0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
2fce0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2fcf0 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a  ensures that:.**
2fd00 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
2fd10 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
2fd20 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64 61  -counter is upda
2fd30 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20  ted,.**   * the 
2fd40 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
2fd50 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 74  d (unless the at
2fd60 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
2fd70 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 29  ization is used)
2fd80 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72  ,.**   * all dir
2fd90 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72 69  ty pages are wri
2fda0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
2fdb0 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20  base file, .**  
2fdc0 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
2fdd0 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
2fde0 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  d (if required),
2fdf0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
2fe00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
2fe10 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nced. .**.** The
2fe20 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
2fe30 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
2fe40 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
2fe50 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a  on is to finaliz
2fe60 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74  e .** (delete, t
2fe70 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
2fe80 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
2fe90 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  f) the journal f
2fea0 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65  ile (or .** dele
2feb0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
2fec0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
2fed0 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
2fee0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
2fef0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
2ff00 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
2ff10 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
2ff20 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
2ff30 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
2ff40 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2ff50 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
2ff60 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
2ff70 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
2ff80 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
2ff90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ffa0 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
2ffb0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
2ffc0 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
2ffd0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
2ffe0 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
2fff0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
30000 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
30010 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
30020 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
30030 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
30040 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
30050 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
30060 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
30070 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
30080 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
30090 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
300a0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
300b0 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
300c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
300d0 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
300e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
300f0 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  name */.  int no
30100 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  Sync            
30110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30120 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78 53  e to omit the xS
30130 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ync on the db fi
30140 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  le */.){.  int r
30150 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
30160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30170 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
30180 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a  /* The dbOrigSiz
30190 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 69  e is never set i
301a0 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f  f journal_mode=O
301b0 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  FF */.  assert( 
301c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
301d0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
301e0 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50  ALMODE_OFF || pP
301f0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
30200 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
30210 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
30220 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
30230 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
30240 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
30250 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
30260 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
30270 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
30280 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
30290 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
302a0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
302b0 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
302c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
302d0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
302e0 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
302f0 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
30300 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
30310 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  d ){.    /* If t
30320 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
30330 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
30340 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
30350 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
30360 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  s.    ** functio
30370 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
30380 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
30390 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e   mostly a no-op.
303a0 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20    However, any. 
303b0 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20     ** backup in 
303c0 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74  progress needs t
303d0 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  o be restarted..
303e0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
303f0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
30400 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
30410 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
30420 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
30430 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50 61  ER_SYNCED && pPa
30440 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
30450 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ){.    if( pager
30460 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
30470 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
30480 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
30490 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
304a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
304b0 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
304c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
304d0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
304e0 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50  Pager, pList, pP
304f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c  ager->dbSize, 1,
30500 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
30510 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
30520 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  ? pPager->sync_f
30530 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20  lags : 0).      
30540 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
30550 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30570 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
30580 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
30590 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Cache);.      }.
305a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
305b0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
305c0 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20  g block updates 
305d0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
305e0 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  er. Exactly how 
305f0 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  it.      ** does
30600 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e   this depends on
30610 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
30620 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
30630 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  e optimization. 
30640 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62       ** was enab
30650 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
30660 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
30670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
30680 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ts the .      **
30690 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69   runtime criteri
306a0 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65  a to use the ope
306b0 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a  ration: .      *
306c0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20  *.      **    * 
306d0 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
306e0 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
306f0 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
30700 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ty for.      ** 
30710 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
30720 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
30730 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  nd .      **    
30740 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
30750 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
30760 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
30770 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
30780 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79   **    * Exactly
30790 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
307a0 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
307b0 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
307c0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
307d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
307e0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
307f0 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
30800 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
30810 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
30820 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
30830 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66  hangecounter() f
30840 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30850 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  d to update the 
30860 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20  change.      ** 
30870 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69  counter in 'indi
30880 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74  rect-mode'. If t
30890 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
308a0 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62  is compiled in b
308b0 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  ut.      ** is n
308c0 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f  ot applicable to
308d0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
308e0 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a  n, call sqlite3J
308f0 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20  ournalCreate(). 
30900 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20       ** to make 
30910 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sure the journal
30920 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c   file has actual
30930 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  ly been created,
30940 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20   then call.     
30950 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
30960 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
30970 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
30980 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
30990 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  ndirect.      **
309a0 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a   mode. .      **
309b0 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  .      ** Otherw
309c0 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
309d0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
309e0 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
309f0 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  licable,.      *
30a00 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65  * then call page
30a10 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
30a20 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
30a30 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
30a40 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ter.      ** in 
30a50 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49  'direct' mode. I
30a60 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
30a70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
30a80 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20  l never be.     
30a90 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20   ** created for 
30aa0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
30ab0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
30ac0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
30ad0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
30ae0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
30af0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
30b00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
30b10 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  d) || pPager->jo
30b20 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
30b30 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
30b40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   );.      if( !z
30b50 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
30b60 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
30b70 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
30b80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
30b90 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
30ba0 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70  er) .       && p
30bb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70  Pager->dbSize>=p
30bc0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
30bd0 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d  e.       && (0==
30be0 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63  (pPg = sqlite3Pc
30bf0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
30c00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20  ager->pPCache)) 
30c10 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74  || 0==pPg->pDirt
30c20 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  y).      ){.    
30c30 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
30c40 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
30c50 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65   counter via the
30c60 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65   direct-write me
30c70 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20  thod. The .     
30c80 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
30c90 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
30ca0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
30cb0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
30cc0 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20   page 1 .       
30cd0 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74   ** to include t
30ce0 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67  he updated chang
30cf0 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
30d00 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
30d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65  .        ** dire
30d20 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
30d30 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75  base file. Becau
30d40 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
30d50 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20  -write .        
30d60 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  ** property of t
30d70 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73  he host file-sys
30d80 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66  tem, this is saf
30d90 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
30da0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30db0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
30dc0 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
30dd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30de0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30df0 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
30e00 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
30e10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30e20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30e30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
30e40 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
30e50 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
30e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30e70 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63    #else.      rc
30e80 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
30e90 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
30ea0 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66  er, 0);.  #endif
30eb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
30ec0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
30ed0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
30ee0 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  _exit;.  .      
30ef0 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73  /* If this trans
30f00 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20  action has made 
30f10 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61  the database sma
30f20 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70  ller, then all p
30f30 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65  ages.      ** be
30f40 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
30f50 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
30f60 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
30f70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
30f80 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68       ** file. Th
30f90 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
30fa0 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
30fb0 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a  m mode..      **
30fc0 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65  .      ** Before
30fd0 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67   reading the pag
30fe0 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
30ff0 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e  bers larger than
31000 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63   the .      ** c
31010 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
31020 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65  Pager.dbSize, se
31030 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f  t dbSize back to
31040 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
31050 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b   ** that it took
31060 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
31070 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31080 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
31090 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  .      ** calls 
310a0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
310b0 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f  et() return zero
310c0 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64  ed pages instead
310d0 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   of .      ** re
310e0 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20  ading data from 
310f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31100 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
31110 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61    ** When journa
31120 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20  l_mode==OFF the 
31130 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c  dbOrigSize is al
31140 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68  ways zero, so th
31150 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  is.      ** bloc
31160 6b 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20  k never runs if 
31170 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46  journal_mode=OFF
31180 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66  ..      */.  #if
31190 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
311a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
311b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
311c0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f  Size<pPager->dbO
311d0 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20  rigSize .       
311e0 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  && ALWAYS(pPager
311f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
31200 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31210 5f 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a 20  _OFF).      ){. 
31220 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20         Pgno i;  
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31250 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
31260 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  iable */.       
31270 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69   const Pgno iSki
31280 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  p = PAGER_MJ_PGN
31290 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65  O(pPager); /* Pe
312a0 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20  nding lock page 
312b0 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
312c0 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
312d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20  Pager->dbSize;  
312e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
312f0 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a   image size */ .
31300 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
31310 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
31320 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20  >dbOrigSize;.   
31330 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69       for( i=dbSi
31340 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  ze+1; i<=pPager-
31350 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b  >dbOrigSize; i++
31360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
31370 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
31380 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
31390 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
313a0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
313b0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
313c0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
313d0 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72   /* Page to jour
313e0 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nal */.         
313f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31400 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
31410 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
31420 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31430 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31440 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31450 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
31460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31470 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
31480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
31490 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
314a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
314b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
314c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
314d0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
314e0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
314f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31500 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
31510 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20  e = dbSize;.    
31520 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20    } .  #endif.  
31530 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
31540 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
31550 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
31560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
31570 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20  f a master .    
31580 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
31590 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
315a0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
315b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
315c0 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ile, .      ** o
315d0 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20  r if zMaster is 
315e0 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20  NULL (no master 
315f0 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74  journal), then t
31600 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
31610 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -op..      */.  
31620 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
31630 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
31640 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
31650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31660 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
31670 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
31680 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
31690 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
316a0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74   file. If the at
316b0 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69  omic-update opti
316c0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e  mization is bein
316d0 67 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2c  g.      ** used,
316e0 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   this call will 
316f0 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a  not create the j
31700 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70  ournal file or p
31710 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20  erform any.     
31720 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20   ** real IO..   
31730 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31740 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
31750 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
31760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
31770 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
31780 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
31790 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c       /* Write al
317a0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
317b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
317c0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  le. */.      rc 
317d0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
317e0 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63  gelist(sqlite3Pc
317f0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
31800 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b  ager->pPCache));
31810 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31830 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
31840 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
31850 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  CKED );.        
31860 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
31870 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
31880 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
31890 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
318a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
318b0 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  ;.  .      /* If
318c0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
318d0 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  k is not the sam
318e0 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61  e size as the da
318f0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20  tabase image,.  
31900 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20      ** then use 
31910 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74  pager_truncate t
31920 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b  o grow or shrink
31930 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a   the file here..
31940 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31950 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
31960 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e!=pPager->dbFil
31970 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
31980 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61   Pgno nNew = pPa
31990 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70  ger->dbSize - (p
319a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
319b0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
319c0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 61  ger));.        a
319d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
319e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
319f0 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 20  USIVE );.       
31a00 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
31a10 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65  cate(pPager, nNe
31a20 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
31a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
31a40 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
31a50 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
31a60 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
31a70 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68  Finally, sync th
31a80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31a90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
31aa0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
31ab0 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
31ac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31ad0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
31ae0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
31af0 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a  flags);.      }.
31b00 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
31b10 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
31b20 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20  ager)).    }..  
31b30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
31b40 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
31b50 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73    }..commit_phas
31b60 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65  e_one_exit:.  re
31b70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
31b80 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
31b90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
31ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31bb0 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70  le has been comp
31bc0 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65  letely.** update
31bd0 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65  d to reflect the
31be0 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
31bf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
31c00 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  nsaction and.** 
31c10 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
31c20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
31c30 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e   still exists in
31c40 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
31c50 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64   .** though, and
31c60 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
31c70 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
31c80 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74  nt it will event
31c90 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64  ually.** be used
31ca0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
31cb0 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  l and the curren
31cc0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  t transaction ro
31cd0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
31ce0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
31cf0 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
31d00 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65  rnal file, eithe
31d10 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a  r by deleting, .
31d20 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72  ** truncating or
31d30 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69   partially zeroi
31d40 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69  ng it, so that i
31d50 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
31d60 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75   .** for hot-jou
31d70 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f  rnal rollback. O
31d80 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65  nce this is done
31d90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31da0 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62   is.** irrevocab
31db0 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  ly committed..**
31dc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
31dd0 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
31de0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
31df0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
31e00 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f  er.** moves into
31e10 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31e20 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
31e30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
31e40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
31e50 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
31e60 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
31e70 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
31e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ea0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
31eb0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
31ec0 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
31ed0 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f  called if a prio
31ee0 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  r error has occu
31ef0 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69  rred..  ** But i
31f00 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69  f (due to a codi
31f10 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65  ng error elsewhe
31f20 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d  re in the system
31f30 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20  ) it does get.  
31f40 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20  ** called, just 
31f50 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
31f60 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f  error code witho
31f70 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
31f80 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  g. */.  if( NEVE
31f90 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
31fa0 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
31fb0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
31fc0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
31fd0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
31fe0 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67  alled if the pag
31ff0 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20  er is not in at 
32000 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52  least.  ** PAGER
32010 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
32020 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69   And indeed SQLi
32030 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68  te never does th
32040 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20  is. But it is.  
32050 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20  ** nice to have 
32060 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 74  this defensive t
32070 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e  est here anyway.
32080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
32090 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  R(pPager->state<
320a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20  PAGER_RESERVED) 
320b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
320c0 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20  ERROR;..  /* An 
320d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
320e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
320f0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
32100 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
32110 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
32120 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
32130 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
32140 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
32150 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
32160 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
32170 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
32180 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
32190 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
321a0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
321b0 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
321c0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
321d0 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
321e0 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
321f0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
32200 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
32210 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
32220 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
32230 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
32240 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
32250 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
32260 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
32270 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
32280 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
32290 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
322a0 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
322b0 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
322c0 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
322d0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
322e0 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
322f0 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
32300 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
32310 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
32320 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
32330 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
32340 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
32350 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
32360 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
32370 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
32380 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
32390 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
323a0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
323b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
323c0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
323d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
323e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
323f0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
32400 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
32410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32420 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
32430 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
32440 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
32450 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
32460 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
32470 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
32480 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
32490 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
324a0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
324b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
324c0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
324d0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
324e0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
324f0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
32500 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
32510 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
32520 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
32530 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
32540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32550 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
32560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32570 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
32580 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
32590 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
325a0 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
325b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
325c0 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
325d0 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
325e0 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
325f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
32600 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
32610 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
32620 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
32630 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
32640 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
32650 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
32660 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
32670 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
32680 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
32690 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
326a0 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
326b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
326c0 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
326d0 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
326e0 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
326f0 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
32700 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
32710 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
32720 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
32730 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
32740 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
32750 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
32760 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
32770 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
32780 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
32790 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
327a0 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
327b0 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
327c0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
327d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
327e0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
327f0 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
32800 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
32810 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
32820 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
32830 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
32840 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
32850 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
32860 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
32870 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
32880 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccussful, also 
32890 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
328a0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
328b0 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
328c0 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
328d0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
328e0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
328f0 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
32900 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
32910 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
32920 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32930 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
32940 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
32950 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
32960 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
32970 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
32980 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32990 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
329a0 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
329b0 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
329c0 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
329d0 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
329e0 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
329f0 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
32a00 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
32a10 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
32a20 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
32a30 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
32a40 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
32a50 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
32a60 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
32a70 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
32a80 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
32a90 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
32aa0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
32ab0 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
32ac0 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
32ad0 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
32ae0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
32af0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
32b00 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
32b10 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
32b20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32b30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
32b40 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
32b50 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
32b60 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
32b70 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
32b80 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
32b90 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
32ba0 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
32bb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
32bc0 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
32bd0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
32be0 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
32bf0 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
32c00 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
32c10 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
32c20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
32c30 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
32c40 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
32c50 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
32c60 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
32c70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
32c80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32c90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
32ca0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
32cb0 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
32cc0 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
32cd0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
32ce0 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
32cf0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
32d00 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  er) ){.    int r
32d10 63 32 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  c2;..    rc = sq
32d20 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
32d30 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56 45  int(pPager, SAVE
32d40 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
32d50 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  -1);.    rc2 = p
32d60 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
32d70 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
32d80 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
32d90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
32da0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
32db0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
32dc0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
32dd0 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
32de0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
32df0 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28  fied || !isOpen(
32e00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32e10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
32e20 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
32e30 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
32e40 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c  etMaster);.  }el
32e50 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  se if( pPager->e
32e60 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
32e70 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
32e80 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
32e90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
32ea0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
32eb0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
32ec0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
32ed0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
32ee0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
32ef0 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
32f00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
32f10 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
32f20 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  VED ){.      int
32f30 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc2;.      rc =
32f40 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
32f50 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
32f60 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e    rc2 = pager_en
32f70 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
32f80 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
32f90 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  tMaster);.      
32fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32fb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
32fc0 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20  = rc2;.      }. 
32fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32fe0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
32ff0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
33000 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
33010 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
33020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
33030 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  id = 0;.    }.. 
33040 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f     /* If an erro
33050 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
33060 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63  a ROLLBACK, we c
33070 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75  an no longer tru
33080 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  st the pager.   
33090 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
330a0 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
330b0 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
330c0 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
330d0 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73  r .    ** persis
330e0 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tent..    */.   
330f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
33100 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
33110 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33120 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33130 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
33140 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
33150 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
33160 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
33170 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
33180 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
33190 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73  ritable..*/.u8 s
331a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
331b0 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
331c0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
331d0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
331e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
331f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
33200 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
33210 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
33220 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
33230 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
33240 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
33250 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
33260 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33270 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  he);.}../*.** Re
33280 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78 69  turn the approxi
33290 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  mate number of b
332a0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63  ytes of memory c
332b0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  urrently.** used
332c0 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61 6e   by the pager an
332d0 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 64  d its associated
332e0 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73   cache..*/.int s
332f0 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55 73  qlite3PagerMemUs
33300 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
33310 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67 65  ){.  int perPage
33320 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
33330 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65 72  ageSize + pPager
33340 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a 20  ->nExtra + 20;. 
33350 20 72 65 74 75 72 6e 20 70 65 72 50 61 67 65 53   return perPageS
33360 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63 68  ize*sqlite3Pcach
33370 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
33380 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20 20  r->pPCache).    
33390 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65 33         + sqlite3
333a0 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67 65  MallocSize(pPage
333b0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
333c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
333d0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
333e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
333f0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
33400 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33410 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
33420 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
33430 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
33440 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
33450 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33460 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
33470 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
33480 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
33490 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
334a0 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
334b0 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
334c0 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
334d0 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
334e0 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
334f0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
33500 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
33510 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
33520 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
33530 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
33540 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
33550 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
33560 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
33570 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
33580 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
33590 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
335a0 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
335b0 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
335c0 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
335d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
335e0 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
335f0 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
33600 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
33610 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
33620 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
33630 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
33640 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
33650 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
33660 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
33670 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
33680 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
33690 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
336a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
336b0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
336c0 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
336d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
336e0 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
336f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
33700 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
33710 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
33720 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
33730 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
33740 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
33750 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
33760 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
33770 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
33780 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
33790 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
337a0 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
337b0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
337c0 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
337d0 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
337e0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
337f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
33800 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
33810 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
33820 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
33830 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
33840 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
33850 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
33860 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
33870 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
33880 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
33890 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
338a0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
338b0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
338c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
338d0 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
338e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
338f0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
33900 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33920 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33930 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
33940 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
33950 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
33960 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
33970 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
33980 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
33990 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
339a0 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
339b0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
339c0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
339d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
339f0 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
33a00 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
33a10 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
33a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a30 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
33a40 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20 20  oint array */.  
33a50 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
33a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
33a80 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  e of database fi
33a90 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
33aa0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
33ab0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
33ac0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33ad0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
33ae0 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
33af0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
33b00 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61   array using rea
33b10 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53  lloc(). Return S
33b20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20  QLITE_NOMEM.    
33b30 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61  ** if the alloca
33b40 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65  tion fails. Othe
33b50 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20  rwise, zero the 
33b60 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63  new portion in c
33b70 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61  ase a .    ** ma
33b80 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
33b90 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61  urs while popula
33ba0 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66  ting it in the f
33bb0 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c  or(...) loop bel
33bc0 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
33bd0 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65  New = (PagerSave
33be0 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52  point *)sqlite3R
33bf0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
33c00 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
33c10 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72  nt, sizeof(Pager
33c20 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65  Savepoint)*nSave
33c30 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20  point.    );.   
33c40 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20   if( !aNew ){.  
33c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33c60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
33c70 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b     memset(&aNew[
33c80 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e  nCurrent], 0, (n
33c90 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65  Savepoint-nCurre
33ca0 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67  nt) * sizeof(Pag
33cb0 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20  erSavepoint));. 
33cc0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
33cd0 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a 20  point = aNew;.. 
33ce0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
33cf0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
33d00 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
33d10 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
33d20 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
33d30 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
33d40 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
33d50 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
33d60 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69  = nPage;.      i
33d70 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
33d80 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
33d90 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
33da0 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
33db0 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
33dc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
33dd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33de0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
33df0 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
33e00 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
33e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
33e20 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
33e30 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
33e40 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
33e50 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
33e60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
33e70 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20  eate(nPage);.   
33e80 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
33e90 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
33ea0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33eb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
33ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33ed0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33ee0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  er) ){.        s
33ef0 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
33f00 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  nt(pPager->pWal,
33f10 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44 61   aNew[ii].aWalDa
33f20 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
33f30 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
33f40 70 6f 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20 20  point = ii+1;.  
33f50 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
33f60 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
33f70 6e 74 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20 29  nt==nSavepoint )
33f80 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e  ;.    assertTrun
33f90 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
33fa0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
33fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33fc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33fd0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
33fe0 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
33ff0 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
34000 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
34010 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
34020 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
34030 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
34040 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
34050 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
34060 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
34070 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
34080 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
34090 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
340a0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
340b0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
340c0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
340d0 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
340e0 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
340f0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
34100 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
34110 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
34120 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
34130 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
34140 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
34150 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
34160 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
34170 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
34180 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
34190 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
341a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
341b0 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
341c0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
341d0 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
341e0 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
341f0 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
34200 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
34210 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
34220 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
34230 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
34240 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
34250 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
34260 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
34270 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
34280 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
34290 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
342a0 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
342b0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
342c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
342d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
342e0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
342f0 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
34300 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
34310 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
34320 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
34330 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
34340 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
34350 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
34360 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
34370 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
34380 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
34390 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
343a0 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
343b0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
343c0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
343d0 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
343e0 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
343f0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
34400 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
34410 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
34420 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
34430 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
34440 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
34450 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
34460 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
34470 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
34480 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
34490 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
344a0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
344b0 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
344c0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
344d0 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
344e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
344f0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
34500 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
34510 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
34520 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
34530 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
34540 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
34550 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
34560 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
34570 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
34580 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
34590 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
345a0 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
345b0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
345c0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
345d0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
345e0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
345f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34600 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
34610 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34620 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
34630 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
34640 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
34650 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
34660 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
34670 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
34680 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
34690 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
346a0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
346b0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
346c0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
346d0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
346e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
346f0 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
34700 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
34710 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
34720 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
34730 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
34740 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
34750 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
34760 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
34770 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
34780 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
34790 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
347a0 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
347b0 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
347c0 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
347d0 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
347e0 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
347f0 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
34800 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d  epoint + (( op==
34810 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34820 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20  E ) ? 0 : 1);.  
34830 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69    for(ii=nNew; i
34840 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
34850 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
34860 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
34870 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
34880 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
34890 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
348a0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
348b0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65  nSavepoint = nNe
348c0 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  w;..    /* If th
348d0 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
348e0 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
348f0 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e   savepoint, trun
34900 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  cate .    ** the
34910 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   sub-journal to 
34920 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
34930 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ze. */.    if( o
34940 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
34950 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66  EASE ){.      if
34960 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f  ( nNew==0 && isO
34970 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
34980 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
34990 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66  Only truncate if
349a0 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d   it is an in-mem
349b0 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  ory sub-journal.
349c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
349d0 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
349e0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
349f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
34a00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
34a10 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  ncate(pPager->sj
34a20 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
34a30 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34a40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
34a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
34a60 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
34a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34a80 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73      /* Else this
34a90 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
34aa0 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61  peration, playba
34ab0 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ck the specified
34ac0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20   savepoint..    
34ad0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
34ae0 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73  temp-file, it is
34af0 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
34b00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34b10 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79  has.    ** not y
34b20 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  et been opened. 
34b30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34b40 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
34b50 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a  changes to.    *
34b60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
34b70 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79  ile, so the play
34b80 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63  back operation c
34b90 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
34ba0 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
34bb0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34bc0 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e  Pager) || isOpen
34bd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
34be0 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
34bf0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
34c00 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
34c10 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
34c20 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
34c30 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
34c40 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
34c50 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
34c60 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
34c70 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
34c80 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a  );.    }.  .  }.
34c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34ca0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
34cb0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
34cc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34cd0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
34ce0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
34cf0 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
34d00 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
34d10 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
34d20 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
34d30 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
34d40 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
34d50 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
34d60 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
34d70 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
34d80 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
34d90 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
34da0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
34db0 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
34dc0 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
34dd0 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
34de0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
34df0 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
34e00 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
34e10 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
34e20 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
34e30 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
34e40 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
34e50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
34e60 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
34e70 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
34e80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
34e90 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
34ea0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
34eb0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
34ec0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
34ed0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
34ee0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
34ef0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
34f00 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
34f10 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
34f20 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
34f30 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
34f40 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
34f50 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
34f60 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
34f70 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
34f80 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
34f90 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
34fa0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
34fb0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
34fc0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
34fd0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
34fe0 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76  * Set or retriev
34ff0 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  e the codec for 
35000 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74  this pager.*/.st
35010 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
35020 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
35030 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
35040 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
35050 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
35060 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
35070 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
35080 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
35090 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
350a0 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a  ecFree)(void*),.
350b0 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29    void *pCodec.)
350c0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
350d0 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
350e0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
350f0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
35100 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
35110 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  c = pPager->memD
35120 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a  b ? 0 : xCodec;.
35130 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
35140 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65  SizeChng = xCode
35150 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61  cSizeChng;.  pPa
35160 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
35170 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20  = xCodecFree;.  
35180 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d  pPager->pCodec =
35190 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72   pCodec;.  pager
351a0 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
351b0 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  r);.}.static voi
351c0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
351d0 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70  etCodec(Pager *p
351e0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
351f0 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b   pPager->pCodec;
35200 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
35210 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35220 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
35230 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
35240 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
35250 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
35260 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
35270 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
35280 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
35290 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
352a0 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
352b0 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
352c0 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
352d0 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
352e0 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
352f0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
35300 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
35310 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
35320 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
35330 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
35340 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
35350 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
35360 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
35370 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
35380 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
35390 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
353a0 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
353b0 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
353c0 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
353d0 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
353e0 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
353f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
35400 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
35410 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
35420 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
35430 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
35440 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
35450 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
35460 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35470 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
35480 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
35490 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
354a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
354b0 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
354c0 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
354d0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
354e0 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
354f0 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
35500 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
35510 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
35520 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
35530 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
35540 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
35550 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
35560 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
35570 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
35580 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
35590 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
355a0 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
355b0 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
355c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
355d0 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
355e0 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
355f0 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
35600 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
35610 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
35620 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
35630 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
35640 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
35650 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
35660 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
35670 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
35680 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  n SQLITE_NOMEM o
35690 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
356a0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
356b0 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77  * occurs. Otherw
356c0 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ise, it returns 
356d0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
356e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
356f0 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
35700 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
35710 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
35720 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
35730 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20  gHdr *pPgOld;   
35740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35750 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
35760 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
35770 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
35780 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
35790 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67  Old value of pPg
357a0 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20  ->pgno, if sync 
357b0 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  is required */. 
357c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
357d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
357e0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
357f0 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b    Pgno origPgno;
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35810 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  * The original p
35820 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  age number */.. 
35830 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
35840 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ef>0 );..  /* In
35850 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c   order to be abl
35860 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  e to rollback, a
35870 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
35880 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61  base must journa
35890 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  l.  ** the page 
358a0 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72  we are moving fr
358b0 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  om..  */.  if( M
358c0 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d  EMDB ){.    rc =
358d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
358e0 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
358f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35900 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
35910 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76  e page being mov
35920 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20  ed is dirty and 
35930 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76  has not been sav
35940 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74  ed by the latest
35950 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c  .  ** savepoint,
35960 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63   then save the c
35970 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
35980 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  of the page into
35990 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
359a0 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73  ournal now. This
359b0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
359c0 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f  handle the follo
359d0 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20  wing scenario:. 
359e0 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
359f0 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
35a00 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e  nal page X, then
35a10 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65   modify it in me
35a20 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53  mory>.  **     S
35a30 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
35a40 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70  **       <Move p
35a50 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f  age X to locatio
35a60 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f  n Y>.  **     RO
35a70 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
35a80 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65   **.  ** If page
35a90 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74   X were not writ
35aa0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
35ab0 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20  ournal here, it 
35ac0 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  would not.  ** b
35ad0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  e possible to re
35ae0 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e  store its conten
35af0 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ts when the "ROL
35b00 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20  LBACK TO one".  
35b10 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72  ** statement wer
35b20 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a  e is processed..
35b30 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75    **.  ** subjou
35b40 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e  rnalPage() may n
35b50 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  eed to allocate 
35b60 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70  space to store p
35b70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20  Pg->pgno into.  
35b80 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ** one or more s
35b90 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
35ba0 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65  . This is the re
35bb0 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ason this functi
35bc0 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  on.  ** may retu
35bd0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
35be0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
35bf0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
35c00 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  TY.   && subjReq
35c10 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
35c20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
35c30 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
35c40 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
35c50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35c60 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
35c70 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
35c80 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
35c90 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
35ca0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
35cb0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
35cc0 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
35cd0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
35ce0 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
35cf0 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
35d00 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
35d10 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
35d20 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
35d30 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
35d40 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
35d50 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
35d60 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
35d70 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
35d80 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
35d90 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
35da0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
35db0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
35dc0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
35dd0 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
35de0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
35df0 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
35e00 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
35e10 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
35e20 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
35e30 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
35e40 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
35e50 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
35e60 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
35e70 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
35e80 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
35e90 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
35ea0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
35eb0 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
35ec0 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
35ed0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
35ee0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
35ef0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
35f00 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
35f10 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
35f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
35f30 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
35f40 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
35f50 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
35f60 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
35f70 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
35f80 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
35f90 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
35fa0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
35fb0 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
35fc0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
35fd0 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
35fe0 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
35ff0 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
36000 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
36010 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
36020 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
36030 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
36040 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
36050 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
36060 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
36070 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
36080 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
36090 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
360a0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
360b0 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
360c0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
360d0 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
360e0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
360f0 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
36100 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
36110 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
36120 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
36130 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72  discard pages fr
36140 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
36150 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77  database since w
36160 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
36170 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
36180 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d  k later.  Just m
36190 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ove the page out
361a0 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a   of the way. */.
361b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
361c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
361d0 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
361e0 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
361f0 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  Old, pPager->dbS
36200 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ize+1);.    }els
36210 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
36220 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
36230 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
36240 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d   origPgno = pPg-
36250 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  >pgno;.  sqlite3
36260 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
36270 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  pgno);.  sqlite3
36280 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
36290 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
362a0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
362b0 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
362c0 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
362d0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
362e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
362f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36300 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
36310 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
36320 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
36330 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
36340 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
36350 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
36360 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
36370 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
36380 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
36390 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
363a0 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
363b0 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
363c0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
363d0 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
363e0 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
363f0 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
36400 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
36410 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
36420 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
36430 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
36440 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
36450 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
36460 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
36470 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
36480 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
36490 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
364a0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
364b0 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
364c0 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
364d0 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
364e0 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
364f0 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
36500 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
36510 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
36520 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
36530 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
36540 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
36550 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
36560 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
36570 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
36580 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
36590 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
365a0 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
365b0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
365c0 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
365d0 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
365e0 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
365f0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
36600 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
36610 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
36620 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
36630 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
36640 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
36650 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
36660 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
36670 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
36680 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36690 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
366a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
366b0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
366c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
366d0 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
366e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
366f0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53  .      if( needS
36700 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
36710 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
36720 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
36730 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
36740 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
36750 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
36760 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
36770 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
36780 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  no, pPager->pTmp
36790 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Space);.      }.
367a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
367b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
367c0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
367d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
367e0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
367f0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  & !MEMDB );.    
36800 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d  pPgHdr->flags |=
36810 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
36820 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
36830 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36840 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
36850 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
36860 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dr);.  }..  /*. 
36870 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65   ** For an in-me
36880 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d  mory database, m
36890 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69  ake sure the ori
368a0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69  ginal page conti
368b0 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69  nues.  ** to exi
368c0 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  st, in case the 
368d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
368e0 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  s to roll back. 
368f0 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a   Use pPgOld.  **
36900 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
36910 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68   page since it h
36920 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
36930 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a  allocated..  */.
36940 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
36950 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
36960 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69  Move(pPgOld, ori
36970 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69  gPgno);.    sqli
36980 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
36990 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  gOld);.  }..  re
369a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
369b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
369c0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
369d0 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
369e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
369f0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
36a00 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
36a10 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
36a20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
36a30 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
36a40 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
36a50 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
36a60 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
36a70 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
36a80 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
36a90 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
36aa0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
36ab0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
36ac0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
36ad0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
36ae0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
36af0 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
36b00 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
36b10 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExtra;.}../*.**
36b20 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
36b30 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
36b40 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
36b50 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
36b60 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
36b70 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
36b80 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
36b90 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
36ba0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
36bb0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
36bc0 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
36bd0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
36be0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
36bf0 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
36c00 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
36c10 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
36c20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
36c30 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
36c40 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
36c50 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
36c60 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
36c70 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
36c80 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
36c90 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
36ca0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
36cb0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
36cc0 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
36cd0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
36ce0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
36cf0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
36d00 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
36d10 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
36d20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
36d30 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
36d40 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
36d50 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
36d60 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
36d70 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
36d80 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
36d90 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
36da0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
36db0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
36dc0 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
36dd0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
36de0 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
36df0 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
36e00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
36e10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
36e20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
36e30 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
36e40 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
36e50 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36e60 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  de;.}../*.** Set
36e70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
36e80 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
36e90 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
36ea0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  e must be one of
36eb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52  :.**.**    PAGER
36ec0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
36ed0 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ETE.**    PAGER_
36ee0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
36ef0 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  CATE.**    PAGER
36f00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
36f10 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52  SIST.**    PAGER
36f20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
36f30 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
36f40 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a  RNALMODE_MEMORY.
36f50 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
36f60 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a  NALMODE_WAL.**.*
36f70 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64  * The journalmod
36f80 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
36f90 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 20  value specified 
36fa0 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  if the change is
36fb0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 54 68 65   allowed..** The
36fc0 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 64   change may be d
36fd0 69 73 61 6c 6c 6f 77 65 64 20 66 6f 72 20 74 68  isallowed for th
36fe0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
36ff0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
37000 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
37010 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
37020 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
37030 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
37040 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
37050 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
37060 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  Temporary databa
37070 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20  ses cannot have 
37080 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65  _WAL journalmode
37090 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
370a0 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
370b0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
370c0 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75  bly updated) jou
370d0 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
370e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
370f0 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  tJournalMode(Pag
37100 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
37110 65 4d 6f 64 65 29 7b 0a 20 20 75 38 20 65 4f 6c  eMode){.  u8 eOl
37120 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d = pPager->jour
37130 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 2f 2a 20 50  nalMode;    /* P
37140 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65  rior journalmode
37150 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 65 4d   */..  /* The eM
37160 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
37170 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 2a 2f   always valid */
37180 0a 20 20 61 73 73 65 72 74 28 20 20 20 20 20 20  .  assert(      
37190 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
371a0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
371b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
371c0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
371d0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
371e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
371f0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37200 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
37210 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37220 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37230 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
37240 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
37250 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
37260 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
37270 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
37280 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37290 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20  DE_MEMORY );..  
372a0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
372b0 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20  the journalmode 
372c0 6f 66 20 61 20 54 45 4d 50 20 64 61 74 61 62 61  of a TEMP databa
372d0 73 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  se to be changed
372e0 20 74 6f 20 57 41 4c 0a 20 20 2a 2f 0a 20 20 69   to WAL.  */.  i
372f0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
37300 69 6c 65 20 26 26 20 65 4d 6f 64 65 3d 3d 50 41  ile && eMode==PA
37310 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37320 57 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  WAL ){.    asser
37330 74 28 20 65 4f 6c 64 21 3d 50 41 47 45 52 5f 4a  t( eOld!=PAGER_J
37340 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
37350 3b 0a 20 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f  ;.    eMode = eO
37360 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  ld;.  }..  /* Do
37370 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e   allow the journ
37380 61 6c 6d 6f 64 65 20 6f 66 20 61 6e 20 69 6e 2d  almode of an in-
37390 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
373a0 74 6f 20 62 65 20 73 65 74 20 74 6f 0a 20 20 2a  to be set to.  *
373b0 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  * anything other
373c0 20 74 68 61 6e 20 4d 45 4d 4f 52 59 20 6f 72 20   than MEMORY or 
373d0 4f 46 46 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  OFF.  */.  if( M
373e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
373f0 72 74 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f  rt( eOld==PAGER_
37400 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
37410 52 59 20 7c 7c 20 65 4f 6c 64 3d 3d 50 41 47 45  RY || eOld==PAGE
37420 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
37430 46 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f  F );.    if( eMo
37440 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37450 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 26 20  LMODE_MEMORY && 
37460 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  eMode!=PAGER_JOU
37470 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
37480 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 65 4f        eMode = eO
37490 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ld;.    }.  }.. 
374a0 20 69 66 28 20 65 4d 6f 64 65 21 3d 65 4f 6c 64   if( eMode!=eOld
374b0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20   ){.    /* When 
374c0 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65 6e  changing between
374d0 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 73 2c   rollback modes,
374e0 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
374f0 61 6c 20 66 69 6c 65 20 70 72 69 6f 72 0a 20 20  al file prior.  
37500 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 68 61 6e    ** to the chan
37510 67 65 2e 20 20 42 75 74 20 77 68 65 6e 20 63 68  ge.  But when ch
37520 61 6e 67 69 6e 67 20 66 72 6f 6d 20 61 20 72 6f  anging from a ro
37530 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 6f 20 57  llback mode to W
37540 41 4c 2c 20 6b 65 65 70 0a 20 20 20 20 2a 2a 20  AL, keep.    ** 
37550 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  the journal open
37560 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
37570 61 20 72 6f 6c 6c 62 61 63 6b 2d 73 74 79 6c 65  a rollback-style
37580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
37590 70 6c 61 79 0a 20 20 20 20 2a 2a 20 75 73 65 64  play.    ** used
375a0 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20   to convert the 
375b0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 20  version numbers 
375c0 69 6e 20 74 68 65 20 62 74 72 65 65 20 68 65 61  in the btree hea
375d0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
375e0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
375f0 72 2d 3e 6a 66 64 29 20 26 26 20 65 4d 6f 64 65  r->jfd) && eMode
37600 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37610 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
37620 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
37630 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
37640 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 61 6e    }..    /* Chan
37650 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  ge the journal m
37660 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ode. */.    pPag
37670 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
37680 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 0a 20 20  = (u8)eMode;..  
37690 20 20 2f 2a 20 57 68 65 6e 20 74 72 61 6e 73 69    /* When transi
376a0 73 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 54 52  stioning from TR
376b0 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53  UNCATE or PERSIS
376c0 54 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20 6a  T to any other j
376d0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f  ournal.    ** mo
376e0 64 65 20 65 78 63 65 70 74 20 57 41 4c 20 28 61  de except WAL (a
376f0 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
37700 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
37710 43 4c 55 53 49 56 45 29 20 74 68 65 6e 20 0a 20  CLUSIVE) then . 
37720 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
37730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
37740 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
37750 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
37760 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
37770 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
37780 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
37790 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
377a0 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)==1 );.    a
377b0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
377c0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
377d0 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 5)==0 );.    
377e0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
377f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
37800 59 20 26 20 35 29 3d 3d 34 20 29 3b 0a 20 20 20  Y & 5)==4 );.   
37810 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37820 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
37830 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 5)==0 );.    a
37840 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37850 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 26 20  URNALMODE_WAL & 
37860 35 29 3d 3d 35 20 29 3b 0a 0a 20 20 20 20 61 73  5)==5 );..    as
37870 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
37880 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
37890 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
378a0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  e );.    if( !pP
378b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
378c0 6f 64 65 20 26 26 20 28 65 4f 6c 64 20 26 20 35  ode && (eOld & 5
378d0 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26  )==1 && (eMode &
378e0 20 31 29 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 20   1)==0 ){..     
378f0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
37900 20 77 65 20 77 6f 75 6c 64 20 6c 69 6b 65 20 74   we would like t
37910 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
37920 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 69 74  rnal file. If it
37930 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74   is.      ** not
37940 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e 20   possible, then 
37950 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72  that is not a pr
37960 6f 62 6c 65 6d 2e 20 44 65 6c 65 74 69 6e 67 20  oblem. Deleting 
37970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37980 0a 20 20 20 20 20 20 2a 2a 20 68 65 72 65 20 69  .      ** here i
37990 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
379a0 6e 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2a  n only..      **
379b0 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65  .      ** Before
379c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
379d0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 62 74 61  urnal file, obta
379e0 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
379f0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  ck on the.      
37a00 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
37a10 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
37a20 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
37a30 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
37a40 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68 69  ted.      ** whi
37a50 6c 65 20 69 74 20 69 73 20 69 6e 20 75 73 65 20  le it is in use 
37a60 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6c  by some other cl
37a70 69 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ient..      */. 
37a80 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
37a90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
37aa0 6e 74 20 73 74 61 74 65 20 3d 20 70 50 61 67 65  nt state = pPage
37ab0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 20 20 20 20  r->state;.      
37ac0 69 66 28 20 73 74 61 74 65 3c 50 41 47 45 52 5f  if( state<PAGER_
37ad0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20  SHARED ){.      
37ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37af0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
37b00 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
37b10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
37b20 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
37b30 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ARED ){.        
37b40 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
37b50 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
37b60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
37b70 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
37b80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
37b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37bb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37bc0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
37bd0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
37be0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
37bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
37c00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
37c10 26 20 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  & state==PAGER_S
37c20 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
37c30 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
37c40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
37c50 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
37c60 20 7d 65 6c 73 65 20 69 66 28 20 73 74 61 74 65   }else if( state
37c70 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
37c80 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
37c90 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
37ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
37cb0 73 65 72 74 28 20 73 74 61 74 65 3d 3d 70 50 61  sert( state==pPa
37cc0 67 65 72 2d 3e 73 74 61 74 65 20 29 3b 0a 20 20  ger->state );.  
37cd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
37ce0 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6a 6f 75  turn the new jou
37cf0 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20 72  rnal mode */.  r
37d00 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
37d10 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
37d20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37d30 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
37d40 6e 61 6c 20 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal mode..*/.int
37d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
37d60 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
37d70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
37d80 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
37d90 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
37da0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
37db0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 72  RUE if the pager
37dc0 20 69 73 20 69 6e 20 61 20 73 74 61 74 65 20 77   is in a state w
37dd0 68 65 72 65 20 69 74 20 69 73 20 4f 4b 20 74 6f  here it is OK to
37de0 20 63 68 61 6e 67 65 20 74 68 65 0a 2a 2a 20 6a   change the.** j
37df0 6f 75 72 6e 61 6c 6d 6f 64 65 2e 20 20 4a 6f 75  ournalmode.  Jou
37e00 72 6e 61 6c 6d 6f 64 65 20 63 68 61 6e 67 65 73  rnalmode changes
37e10 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
37e20 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
37e30 73 65 0a 2a 2a 20 69 73 20 75 6e 6d 6f 64 69 66  se.** is unmodif
37e40 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
37e50 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61 6e  te3PagerOkToChan
37e60 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  geJournalMode(Pa
37e70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
37e80 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
37e90 64 69 66 69 65 64 20 29 20 72 65 74 75 72 6e 20  dified ) return 
37ea0 30 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  0;.  if( isOpen(
37eb0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
37ec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37ed0 66 66 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ff>0 ) return 0;
37ee0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
37ef0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
37f00 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65  e size-limit use
37f10 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  d for persistent
37f20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
37f30 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68  **.** Setting th
37f40 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20  e size limit to 
37f50 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69  -1 means no limi
37f60 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a  t is enforced..*
37f70 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  * An attempt to 
37f80 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c  set a limit smal
37f90 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61  ler than -1 is a
37fa0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73   no-op..*/.i64 s
37fb0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
37fc0 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
37fd0 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
37fe0 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
37ff0 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
38000 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
38010 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
38020 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
38030 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
38040 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  izeLimit;.}../*.
38050 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
38060 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 65  ter to the pPage
38070 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61  r->pBackup varia
38080 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20  ble. The backup 
38090 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63  module.** in bac
380a0 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20  kup.c maintains 
380b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
380c0 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68  his variable. Th
380d0 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65  is module.** use
380e0 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73  s it opaquely as
380f0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
38100 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
38110 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71  tart() and.** sq
38120 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
38130 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c  e() only..*/.sql
38140 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71  ite3_backup **sq
38150 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70  lite3PagerBackup
38160 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Ptr(Pager *pPage
38170 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50  r){.  return &pP
38180 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d  ager->pBackup;.}
38190 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
381a0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
381b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
381c0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
381d0 20 75 73 65 72 20 69 6e 76 6f 6b 65 73 20 22 50   user invokes "P
381e0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
381f0 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  "..*/.int sqlite
38200 33 50 61 67 65 72 43 68 65 63 6b 70 6f 69 6e 74  3PagerCheckpoint
38210 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
38220 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
38230 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
38240 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 20 20 20  ger->pWal ){.   
38250 20 75 38 20 2a 7a 42 75 66 20 3d 20 28 75 38 20   u8 *zBuf = (u8 
38260 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
38270 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ace;.    rc = sq
38280 6c 69 74 65 33 57 61 6c 43 68 65 63 6b 70 6f 69  lite3WalCheckpoi
38290 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  nt(pPager->pWal,
382a0 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
382b0 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70  ->noSync ? 0 : p
382c0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
382d0 73 29 2c 0a 20 20 20 20 20 20 20 20 70 50 61 67  s),.        pPag
382e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 7a 42  er->pageSize, zB
382f0 75 66 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  uf.    );.  }.  
38300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
38310 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 61  t sqlite3PagerWa
38320 6c 43 61 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  lCallback(Pager 
38330 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
38340 72 6e 20 73 71 6c 69 74 65 33 57 61 6c 43 61 6c  rn sqlite3WalCal
38350 6c 62 61 63 6b 28 70 50 61 67 65 72 2d 3e 70 57  lback(pPager->pW
38360 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  al);.}../*.** Re
38370 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
38380 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53 20   underlying VFS 
38390 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
383a0 67 65 72 20 73 75 70 70 6f 72 74 73 20 74 68 65  ger supports the
383b0 0a 2a 2a 20 70 72 69 6d 69 74 69 76 65 73 20 6e  .** primitives n
383c0 65 63 65 73 73 61 72 79 20 66 6f 72 20 77 72 69  ecessary for wri
383d0 74 65 2d 61 68 65 61 64 20 6c 6f 67 67 69 6e 67  te-ahead logging
383e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
383f0 50 61 67 65 72 57 61 6c 53 75 70 70 6f 72 74 65  PagerWalSupporte
38400 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
38410 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
38420 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
38430 65 74 68 6f 64 73 20 3d 20 70 50 61 67 65 72 2d  ethods = pPager-
38440 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3b 0a 20  >fd->pMethods;. 
38450 20 72 65 74 75 72 6e 20 70 4d 65 74 68 6f 64 73   return pMethods
38460 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26  ->iVersion>=2 &&
38470 20 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4f   pMethods->xShmO
38480 70 65 6e 21 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pen!=0;.}../*.**
38490 20 4f 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69   Open a connecti
384a0 6f 6e 20 74 6f 20 74 68 65 20 77 72 69 74 65 2d  on to the write-
384b0 61 68 65 61 64 20 6c 6f 67 20 66 69 6c 65 20 66  ahead log file f
384c0 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  or pager pPager.
384d0 20 49 66 0a 2a 2a 20 74 68 65 20 6c 6f 67 20 63   If.** the log c
384e0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 72  onnection is alr
384f0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
38500 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
38510 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  -op..**.** The c
38520 61 6c 6c 65 72 20 6d 75 73 74 20 62 65 20 68 6f  aller must be ho
38530 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  lding a SHARED l
38540 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
38550 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c  ase file to call
38560 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
38570 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
38580 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 50 61  3PagerOpenWal(Pa
38590 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
385a0 20 2a 70 69 73 4f 70 65 6e 29 7b 0a 20 20 69 6e   *pisOpen){.  in
385b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
385c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
385d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
385e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
385f0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
38600 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
38610 21 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b  !pPager->pWal ){
38620 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
38630 33 50 61 67 65 72 57 61 6c 53 75 70 70 6f 72 74  3PagerWalSupport
38640 65 64 28 70 50 61 67 65 72 29 20 29 20 72 65 74  ed(pPager) ) ret
38650 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
38660 50 45 4e 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  PEN;..    /* Ope
38670 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
38680 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
38690 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
386a0 69 6f 6e 20 66 61 69 6c 73 2c 20 0a 20 20 20 20  ion fails, .    
386b0 2a 2a 20 28 65 2e 67 2e 20 64 75 65 20 74 6f 20  ** (e.g. due to 
386c0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
386d0 29 2c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ), unlock the da
386e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
386f0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  .    ** return a
38700 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20  n error code..  
38710 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
38720 6c 69 74 65 33 57 61 6c 4f 70 65 6e 28 70 50 61  lite3WalOpen(pPa
38730 67 65 72 2d