/ Hex Artifact Content
Login

Artifact 4afcd7027c53990e67878f50df9ff769ff619923:


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 20 20 20 20 69 6e 74 20 69 44 63 20 3d  */.    int iDc =
c030: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c040: 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76  fd)?sqlite3OsDev
c050: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c060: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30  cs(pPager->fd):0
c070: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
c080: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
c090: 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69  m support deleti
c0a0: 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73  on of open files
c0b0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c  , then.    ** cl
c0c0: 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ose the journal 
c0d0: 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69  file when droppi
c0e0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
c0f0: 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65  lock.  Otherwise
c100: 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20  .    ** another 
c110: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
c120: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c  journal_mode=del
c130: 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65  ete might delete
c140: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
c150: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
c160: 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  us..    */.    a
c170: 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
c180: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
c190: 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
c1a0: 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
c1b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
c1c0: 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
c1d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
c1e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c1f0: 57 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31  WAL      & 5)!=1
c200: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c210: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c220: 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29  DE_DELETE   & 5)
c230: 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
c240: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
c250: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
c260: 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
c270: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
c280: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
c290: 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20    & 5)==1 );.   
c2a0: 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53   if( 0==(iDc & S
c2b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
c2c0: 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
c2d0: 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70  N).     || 1!=(p
c2e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
c2f0: 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20  de & 5).    ){. 
c300: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
c310: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
c320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
c330: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
c340: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
c350: 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
c360: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
c370: 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41 6c  0;.    releaseAl
c380: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c390: 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
c3a0: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
c3b0: 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20 65  cked, somebody e
c3c0: 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65  lse might change
c3d0: 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20   it. The.    ** 
c3e0: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
c3f0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65 74   Pager.dbSize et
c400: 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  c. might become 
c410: 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20 2a  invalid if.    *
c420: 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  * this happens. 
c430: 20 4f 6e 65 20 63 61 6e 20 61 72 67 75 65 20 74   One can argue t
c440: 68 61 74 20 74 68 69 73 20 64 6f 65 73 6e 27 74  hat this doesn't
c450: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
c460: 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c  red.    ** until
c470: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
c480: 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20  ter check fails 
c490: 69 6e 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  in PagerSharedLo
c4a0: 63 6b 28 29 2e 0a 20 20 20 20 2a 2a 20 43 6c 65  ck()..    ** Cle
c4b0: 61 72 69 6e 67 20 74 68 65 20 70 61 67 65 20 73  aring the page s
c4c0: 69 7a 65 20 63 61 63 68 65 20 68 65 72 65 20 69  ize cache here i
c4d0: 73 20 62 65 69 6e 67 20 63 6f 6e 73 65 72 76 61  s being conserva
c4e0: 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
c4f0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
c500: 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 69  alid = 0;..    i
c510: 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
c520: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
c530: 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
c540: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
c550: 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
c560: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
c570: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
c580: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
c590: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
c5a0: 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  c ){.      pPage
c5b0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
c5c0: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
c5d0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
c5e0: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
c5f0: 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72   /* If Pager.err
c600: 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65  Code is set, the
c610: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
c620: 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e   pager cache can
c630: 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72  not be.    ** tr
c640: 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20  usted. Now that 
c650: 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
c660: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20  s unlocked, the 
c670: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
c680: 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e      ** cache can
c690: 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e   be discarded an
c6a0: 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
c6b0: 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e   safely cleared.
c6c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c6d0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c6e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
c6f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c700: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
c710: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
c720: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
c730: 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
c740: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
c750: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
c760: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
c770: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
c780: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
c790: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
c7a0: 64 69 66 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  dified = 0;.  }.
c7b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
c7c0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
c7d0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
c7e0: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
c7f0: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
c800: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65  may have occurre
c810: 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  d. The first arg
c820: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
c830: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
c840: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74  .** structure, t
c850: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  he second the er
c860: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
c870: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
c880: 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49   a pager .** API
c890: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
c8a0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c8b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
c8c0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a  econd argument .
c8d0: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
c8e0: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
c8f0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
c900: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
c910: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
c920: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
c930: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
c940: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
c950: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
c960: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
c970: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
c980: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
c990: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
c9a0: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
c9b0: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
c9c0: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
c9d0: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
c9e0: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
c9f0: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
ca00: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
ca10: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
ca20: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
ca30: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
ca40: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
ca50: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
ca60: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
ca70: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
ca80: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
ca90: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
caa0: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
cab0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
cac0: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
cad0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
cae0: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
caf0: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
cb00: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
cb10: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
cb20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
cb30: 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
cb40: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
cb50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
cb60: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
cb70: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
cb80: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
cb90: 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
cba0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
cbb0: 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
cbc0: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
cbd0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
cbe0: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
cbf0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
cc00: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
cc10: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
cc20: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
cc30: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
cc40: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
cc50: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
cc60: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
cc70: 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
cc80: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
cc90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
cca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
ccb0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
ccc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
ccd0: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
cce0: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
ccf0: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
cd00: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
cd10: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
cd20: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
cd30: 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
cd40: 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
cd50: 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
cd60: 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
cd70: 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
cd80: 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
cd90: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
cda0: 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
cdb0: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
cdc0: 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
cdd0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
cde0: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  nd clear the err
cdf0: 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  or state. If thi
ce00: 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  s means that.** 
ce10: 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
ce20: 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
ce30: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
ce40: 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74  the next connect
ce50: 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  ion.** to obtain
ce60: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
ce70: 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
ce80: 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
ce90: 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c  ne) will.** roll
cea0: 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
ceb0: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
cec0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
ced0: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
cee0: 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
cef0: 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
cf00: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
cf10: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
cf20: 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
cf30: 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
cf40: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
cf50: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
cf60: 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
cf70: 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
cf80: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
cf90: 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
cfa0: 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
cfb0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
cfc0: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
cfd0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
cfe0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
cff0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
d000: 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73  _OK && pPager->s
d010: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
d020: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
d030: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
d040: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
d050: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
d060: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
d070: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
d080: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
d090: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
d0a0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  r);.}../*.** Thi
d0b0: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
d0c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
d0d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
d0e0: 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
d0f0: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
d100: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
d110: 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
d120: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
d130: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
d140: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
d150: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
d160: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
d170: 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
d180: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
d190: 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
d1a0: 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
d1b0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
d1c0: 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
d1d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
d1e0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
d1f0: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  is in PAGER_SHAR
d200: 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f  ED or PAGER_UNLO
d210: 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
d220: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
d230: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
d240: 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20   no-op (returns 
d250: 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a  SQLITE_OK)..**.*
d260: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
d270: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
d280: 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
d290: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
d2a0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
d2b0: 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
d2c0: 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
d2d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
d2e0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
d2f0: 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
d300: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
d310: 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
d320: 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
d330: 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
d340: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
d350: 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
d360: 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
d370: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
d380: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
d390: 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
d3a0: 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
d3b0: 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
d3c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
d3d0: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d3e0: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d3f0: 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
d400: 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
d410: 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
d420: 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
d430: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d440: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d450: 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
d460: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
d470: 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
d480: 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
d490: 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
d4a0: 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
d4b0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
d4c0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
d4d0: 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
d4e0: 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
d4f0: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
d500: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
d510: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
d520: 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
d530: 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
d540: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
d550: 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
d560: 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
d570: 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
d580: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
d590: 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
d5a0: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
d5b0: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
d5c0: 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
d5d0: 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
d5e0: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
d5f0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d600: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
d610: 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
d620: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d630: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
d640: 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
d650: 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
d660: 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
d670: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
d680: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
d690: 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
d6a0: 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
d6b0: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
d6c0: 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
d6d0: 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
d6e0: 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
d6f0: 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
d700: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
d710: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d720: 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
d730: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
d740: 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
d750: 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
d760: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
d770: 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
d780: 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
d790: 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  , if running in 
d7a0: 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f  non-exclusive mo
d7b0: 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72  de, the.** pager
d7c0: 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
d7d0: 53 48 41 52 45 44 20 73 74 61 74 65 20 28 61 6e  SHARED state (an
d7e0: 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65  d downgrades the
d7f0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20   lock on the.** 
d800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63  database file ac
d810: 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a  cordingly)..**.*
d820: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
d830: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d840: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
d850: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43  is in PAGER_SYNC
d860: 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20  ED state,.** it 
d870: 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45  moves to PAGER_E
d880: 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63  XCLUSIVE. No loc
d890: 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65  ks are downgrade
d8a0: 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  d when running i
d8b0: 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d  n.** exclusive m
d8c0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ode..**.** SQLIT
d8d0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d8e0: 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
d8f0: 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
d900: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
d910: 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
d920: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
d930: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
d940: 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
d950: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
d960: 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
d970: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
d980: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
d990: 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
d9a0: 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
d9b0: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
d9c0: 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
d9d0: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
d9e0: 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
d9f0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
da00: 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
da10: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
da20: 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
da30: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
da40: 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
da50: 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
da60: 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
da70: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
da80: 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
da90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
daa0: 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
dab0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
dac0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
dad0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
dae0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
daf0: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
db00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
db10: 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
db20: 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
db30: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
db40: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
db50: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
db60: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
db70: 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
db80: 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
db90: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70  tion */..  if( p
dba0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
dbb0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
dbc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dbd0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  _OK;.  }.  relea
dbe0: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
dbf0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65  pPager);..  asse
dc00: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
dc10: 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
dc20: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
dc30: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
dc40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
dc50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
dc60: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
dc70: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  ) );..    /* Fin
dc80: 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
dc90: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  l file. */.    i
dca0: 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a  f( sqlite3IsMemJ
dcb0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
dcc0: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fd) ){.      ass
dcd0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
dce0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
dcf0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
dd00: 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  RY );.      sqli
dd10: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
dd20: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
dd30: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
dd40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
dd50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
dd60: 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
dd70: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
dd80: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
dd90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
dda0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
ddb0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ddc0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
ddd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
dde0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ddf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
de00: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
de10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
de20: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
de30: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
de40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
de50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
de60: 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
de70: 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
de80: 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
de90: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
dea0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
deb0: 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
dec0: 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
ded0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
dee0: 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
def0: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
df00: 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
df10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
df20: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
df30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
df40: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
df50: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
df60: 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
df70: 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
df80: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
df90: 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
dfa0: 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
dfb0: 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
dfc0: 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
dfd0: 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
dfe0: 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
dff0: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
e000: 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
e010: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
e020: 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
e030: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
e040: 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
e050: 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
e060: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
e070: 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
e080: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
e090: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
e0a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
e0b0: 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
e0c0: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
e0d0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
e0e0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
e0f0: 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
e100: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
e110: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e120: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
e130: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
e140: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
e150: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
e160: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
e170: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
e180: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e190: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
e1a0: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
e1b0: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
e1c0: 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66   }.    }..#ifdef
e1d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
e1e0: 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50  GES.    sqlite3P
e1f0: 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
e200: 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
e210: 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
e220: 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ehash);.#endif. 
e230: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
e240: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
e250: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
e260: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
e270: 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
e280: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
e290: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
e2a0: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
e2b0: 61 63 68 65 29 3b 0a 0a 20 20 69 66 28 20 70 61  ache);..  if( pa
e2c0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
e2d0: 29 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73  ) ){.    rc2 = s
e2e0: 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74  qlite3WalEndWrit
e2f0: 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
e300: 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
e310: 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c  assert( rc2==SQL
e320: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 70 50  ITE_OK );.    pP
e330: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
e340: 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20  GER_SHARED;..   
e350: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65   /* If the conne
e360: 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 6c 6f 63  ction was in loc
e370: 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
e380: 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20  ive mode but is 
e390: 6e 6f 20 6c 6f 6e 67 65 72 2c 0a 20 20 20 20 2a  no longer,.    *
e3a0: 2a 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  * drop the EXCLU
e3b0: 53 49 56 45 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  SIVE lock held o
e3c0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
e3d0: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
e3e0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
e3f0: 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71  lusiveMode && sq
e400: 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
e410: 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
e420: 61 6c 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  al, 0) ){.      
e430: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
e440: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
e450: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20  D_LOCK);.    }. 
e460: 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
e470: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
e480: 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f  e ){.    rc2 = o
e490: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
e4a0: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
e4b0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
e4c0: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
e4d0: 45 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ED;.    pPager->
e4e0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
e4f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
e500: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
e510: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
e520: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
e530: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
e540: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
e550: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
e560: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
e570: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
e580: 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
e590: 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20   0;..  /* TODO: 
e5a0: 49 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f  Is this optimal?
e5b0: 20 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73   Why is the db s
e5c0: 69 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  ize invalidated 
e5d0: 68 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20  here .  ** when 
e5e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e5f0: 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65  e is not unlocke
e600: 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  d? */.  pPager->
e610: 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a  dbOrigSize = 0;.
e620: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54    sqlite3PcacheT
e630: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
e640: 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d  pPCache, pPager-
e650: 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  >dbSize);.  if( 
e660: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50  !MEMDB ){.    pP
e670: 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
e680: 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  d = 0;.  }..  re
e690: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
e6a0: 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
e6b0: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
e6c0: 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74  aData must point
e6d0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
e6e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e6f0: 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
e700: 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  a. Compute and r
e710: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
e720: 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63   based ont the c
e730: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
e740: 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20  ** page of data 
e750: 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
e760: 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d  value of pPager-
e770: 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a  >cksumInit..**.*
e780: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
e790: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49  real checksum. I
e7a0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
e7b0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
e7c0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
e7d0: 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72  al value (pPager
e7e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64  ->cksumInit) and
e7f0: 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74   every 200th byt
e800: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
e810: 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20   data, starting 
e820: 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74  with byte offset
e830: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
e840: 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68  ze%200)..** Each
e850: 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
e860: 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74  eted as an 8-bit
e870: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
e880: 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e  r..**.** Changin
e890: 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  g the formula us
e8a0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
e8b0: 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75  is checksum resu
e8c0: 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63  lts in an.** inc
e8d0: 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61  ompatible journa
e8e0: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a  l file format..*
e8f0: 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20  *.** If journal 
e900: 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
e910: 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
e920: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
e930: 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63  st likely .** sc
e940: 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f  enario is that o
e950: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
e960: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
e970: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
e980: 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63  d. .** It is muc
e990: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
e9a0: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
e9b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
e9c0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
e9d0: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
e9e0: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
e9f0: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
ea00: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
ea10: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
ea20: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
ea30: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
ea40: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
ea50: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
ea60: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
ea70: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
ea80: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
ea90: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
eaa0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
eab0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
eac0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  /* Checksum valu
ead0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
eae0: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
eaf0: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20  >pageSize-200;  
eb00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
eb10: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69  counter */.  whi
eb20: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
eb30: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
eb40: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
eb50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
eb60: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
eb70: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
eb80: 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
eb90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
eba0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
ebb0: 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
ebc0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
ebd0: 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
ebe0: 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
ebf0: 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
ec00: 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
ec10: 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
ec20: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
ec30: 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
ec40: 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
ec50: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ec60: 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
ec70: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
ec80: 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c  * The isMainJrnl
ec90: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
eca0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   this is the mai
ecb0: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
ecc0: 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20  al and.** false 
ecd0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
ece0: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  t journal.  The 
ecf0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
ed00: 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68  urnal uses.** ch
ed10: 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
ed20: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
ed30: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  does not..**.** 
ed40: 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
ed50: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72  er of the page r
ed60: 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20  ecord read from 
ed70: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
ed80: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  l file.** is gre
ed90: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
eda0: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
edb0: 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65  ager.dbSize, the
edc0: 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a  n playback is.**
edd0: 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c   skipped and SQL
ede0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
edf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f  ed..**.** If pDo
ee00: 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ne is not NULL, 
ee10: 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63  then it is a rec
ee20: 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61  ord of pages tha
ee30: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a  t have already.*
ee40: 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61  * been played ba
ee50: 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ck.  If the page
ee60: 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73   at *pOffset has
ee70: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
ee80: 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66  ayed back.** (if
ee90: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
eea0: 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20  ng pDone bit is 
eeb0: 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74  set) then skip t
eec0: 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20  he playback..** 
eed0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44  Make sure the pD
eee0: 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  one bit correspo
eef0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f  nding to the *pO
ef00: 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65  ffset page is se
ef10: 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65  t.** prior to re
ef20: 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
ef30: 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
ef40: 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  d is successfull
ef50: 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
ef60: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
ef70: 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64  le.** and played
ef80: 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49   back, then SQLI
ef90: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
efa0: 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
efb0: 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c  r occurs.** whil
efc0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65  e reading the re
efd0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73  cord from the (s
efe0: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
eff0: 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e   or while writin
f000: 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  g.** to the data
f010: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
f020: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
f030: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
f040: 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63  f data.** is suc
f050: 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
f060: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
f070: 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61  urnal file but a
f080: 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20  ppears to be.** 
f090: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
f0a0: 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
f0b0: 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73  ed. Data is cons
f0c0: 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64  idered corrupted
f0d0: 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75   in.** two circu
f0e0: 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a  mstances:.** .**
f0f0: 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
f100: 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  rd page-number i
f110: 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20  s illegal (0 or 
f120: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20  PAGER_MJ_PGNO), 
f130: 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  or.**   * If the
f140: 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67   record is being
f150: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f   rolled back fro
f160: 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
f170: 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61  al file.**     a
f180: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
f190: 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d  field does not m
f1a0: 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20  atch the record 
f1b0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e  content..**.** N
f1c0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
f1d0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72  two scenarios ar
f1e0: 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e  e possible durin
f1f0: 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  g a savepoint ro
f200: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
f210: 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70   this is a savep
f220: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  oint rollback, t
f230: 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68  hen memory may h
f240: 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ave to be dynami
f250: 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  cally.** allocat
f260: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
f270: 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  ion. If this is 
f280: 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20  the case and an 
f290: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
f2a0: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ,.** SQLITE_NOME
f2b0: 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  M is returned..*
f2c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
f2d0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
f2e0: 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  page(.  Pager *p
f2f0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
f300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
f310: 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20  er being played 
f320: 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70  back */.  i64 *p
f330: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
f340: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f350: 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
f360: 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74  layback */.  Bit
f370: 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20  vec *pDone,     
f380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
f390: 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
f3a0: 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63  ready played bac
f3b0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
f3c0: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
f3d0: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
f3e0: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
f3f0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
f400: 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20    int isSavepnt 
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61  /* True for a sa
f430: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
f440: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
f450: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
f480: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
f490: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
f4a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f4b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
f4c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
f4d0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
f4e0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
f510: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
f520: 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  king */.  char *
f530: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
f540: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
f550: 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
f560: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
f570: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
f580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f590: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
f5a0: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
f5b0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nal file */.  in
f5c0: 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20  t isSynced;     
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f5e0: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70  rue if journal p
f5f0: 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  age is synced */
f600: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
f610: 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
f620: 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
f630: 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
f640: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
f650: 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
f660: 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
f670: 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
f680: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
f690: 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
f6a0: 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
f6b0: 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
f6c0: 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
f6d0: 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
f6e0: 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
f6f0: 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
f700: 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
f710: 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
f720: 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
f730: 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
f740: 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
f750: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
f760: 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
f770: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
f780: 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
f790: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
f7a0: 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
f7b0: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
f7c0: 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
f7d0: 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
f7e0: 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
f7f0: 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
f800: 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
f810: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
f820: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
f830: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
f840: 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
f850: 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
f860: 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
f870: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
f880: 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
f890: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f8a0: 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
f8b0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
f8c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
f8d0: 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
f8e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
f8f0: 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
f900: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
f910: 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
f920: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f930: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
f940: 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
f950: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
f960: 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
f970: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
f980: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
f990: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
f9a0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
f9b0: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
f9c0: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
f9d0: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
f9e0: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
f9f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
fa00: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
fa10: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
fa20: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
fa30: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
fa40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
fa50: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
fa60: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
fa70: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
fa80: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
fa90: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
faa0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
fab0: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
fac0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
fad0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
fae0: 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
faf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb00: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
fb10: 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
fb20: 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
fb30: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
fb40: 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
fb50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fb60: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
fb70: 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
fb80: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
fb90: 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
fba0: 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
fbb0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
fbc0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
fbd0: 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
fbe0: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
fbf0: 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75  u8*)aData)!=cksu
fc00: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
fc10: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
fc20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
fc30: 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
fc40: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
fc50: 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
fc60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fc70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
fc80: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
fc90: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
fca0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
fcb0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
fcc0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
fcd0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
fce0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
fcf0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
fd00: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
fd10: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
fd20: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
fd30: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
fd40: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
fd50: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
fd60: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
fd70: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
fd80: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
fd90: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
fda0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
fdb0: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
fdc0: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
fdd0: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
fde0: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
fdf0: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
fe00: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
fe10: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
fe20: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
fe30: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
fe40: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
fe50: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
fe60: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
fe70: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
fe80: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
fe90: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
fea0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
feb0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
fec0: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
fed0: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
fee0: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
fef0: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
ff00: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
ff10: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
ff20: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
ff30: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
ff40: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
ff50: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
ff60: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
ff70: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
ff80: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
ff90: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
ffa0: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
ffb0: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
ffc0: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
ffd0: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
ffe0: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
fff0: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
10000 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
10010 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
10020 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
10030 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
10040 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
10050 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
10060 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
10070 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
10080 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
10090 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
100a0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
100b0 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
100c0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
100d0 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
100e0 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
100f0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
10100 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
10110 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
10120 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
10130 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
10140 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
10150 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
10160 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
10170 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
10180 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
10190 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
101a0 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
101b0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
101c0 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
101d0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
101e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
101f0 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
10200 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
10210 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
10220 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
10230 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
10240 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
10250 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
10260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
10270 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
10280 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
10290 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
102a0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
102b0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
102c0 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
102d0 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
102e0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
102f0 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
10300 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
10310 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
10320 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
10330 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
10340 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
10350 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
10360 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
10370 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
10380 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
10390 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
103a0 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
103b0 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
103c0 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
103d0 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
103e0 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
103f0 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
10400 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
10410 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
10420 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
10430 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10440 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
10450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
10460 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
10470 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
10480 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
10490 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
104a0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
104b0 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
104c0 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
104d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50  n",.           P
104e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
104f0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
10500 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
10510 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74  eSize, (u8*)aDat
10520 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  a),.           (
10530 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
10540 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
10550 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
10560 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
10570 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  ){.    isSynced 
10580 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
10590 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d   || (*pOffset <=
105a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
105b0 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hdr);.  }else{. 
105c0 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70     isSynced = (p
105d0 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
105e0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
105f0 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d  NEED_SYNC));.  }
10600 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
10610 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
10620 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 69 73  LUSIVE).   && is
10630 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
10640 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
10650 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
10660 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
10670 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
10680 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
10690 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
106a0 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
106b0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
106c0 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
106d0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
106e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
106f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10700 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
10710 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  >fd, (u8*)aData,
10720 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10730 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  e, ofst);.    if
10740 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
10750 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
10760 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
10770 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
10780 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
10790 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20  er->pBackup ){. 
107a0 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
107b0 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
107c0 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   3, rc=SQLITE_NO
107d0 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MEM);.      sqli
107e0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
107f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
10800 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
10810 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32  a);.      CODEC2
10820 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
10830 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
10840 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29  TE_NOMEM, aData)
10850 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
10860 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
10870 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
10880 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
10890 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
108a0 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
108b0 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
108c0 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
108d0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
108e0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
108f0 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
10900 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
10910 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
10920 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
10930 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
10940 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
10950 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
10960 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
10970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
10980 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
10990 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
109a0 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
109b0 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
109c0 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
109d0 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
109e0 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
109f0 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
10a00 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
10a10 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
10a20 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
10a30 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
10a40 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
10a50 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
10a60 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
10a70 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
10a80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
10a90 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
10aa0 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
10ab0 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
10ac0 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
10ad0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
10ae0 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
10af0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
10b00 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
10b10 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
10b20 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
10b30 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
10b40 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
10b50 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
10b60 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
10b70 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
10b80 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
10b90 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
10ba0 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
10bb0 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
10bc0 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
10bd0 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
10be0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
10bf0 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
10c00 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
10c10 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
10c20 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
10c30 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49   &pPg, 1))!=SQLI
10c40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10c50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10c60 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26      pPg->flags &
10c70 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45  = ~PGHDR_NEED_RE
10c80 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  AD;.    sqlite3P
10c90 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
10ca0 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Pg);.  }.  if( p
10cb0 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
10cc0 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
10cd0 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
10ce0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
10cf0 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
10d00 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
10d10 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
10d20 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
10d30 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
10d40 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
10d50 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
10d60 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
10d70 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
10d80 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
10d90 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
10da0 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
10db0 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
10dc0 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
10dd0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
10de0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
10df0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
10e00 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44  d *pData;.    pD
10e10 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
10e20 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
10e30 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  ta, (u8*)aData, 
10e40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10e50 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  );.    pPager->x
10e60 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20  Reiniter(pPg);. 
10e70 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e     if( isMainJrn
10e80 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74  l && (!isSavepnt
10e90 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50   || *pOffset<=pP
10ea0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10eb0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
10ec0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10ed0 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20   this page were 
10ee0 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72  just restored fr
10ef0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20  om the main .   
10f00 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
10f10 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e  le, then its con
10f20 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20  tent must be as 
10f30 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74  they were when t
10f40 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  he .      ** tra
10f50 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72  nsaction was fir
10f60 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  st opened. In th
10f70 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d  is case we can m
10f80 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20  ark the page.   
10f90 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20     ** as clean, 
10fa0 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c  since there will
10fb0 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77   be no need to w
10fc0 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
10fd0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
10fe0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  base..      **. 
10ff0 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
11000 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
11010 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
11020 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
11030 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
11040 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
11050 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
11060 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
11070 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
11080 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
11090 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
110a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
110b0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
110c0 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
110d0 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
110e0 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
110f0 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
11100 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
11110 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
11120 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
11130 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
11140 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
11150 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
11160 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
11170 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
11180 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
11190 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
111a0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
111b0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
111c0 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
111d0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
111e0 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
111f0 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
11200 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
11210 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
11220 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
11230 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
11240 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
11250 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
11260 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
11270 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
11280 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
11290 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
112a0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
112b0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
112c0 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
112d0 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
112e0 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
112f0 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
11300 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
11310 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
11320 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
11330 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
11340 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
11350 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
11360 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
11370 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
11380 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
11390 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
113a0 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
113b0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
113c0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
113d0 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
113e0 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
113f0 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
11400 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
11410 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
11420 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
11430 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
11440 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
11450 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
11460 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
11470 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
11480 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
11490 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
114a0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
114b0 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
114c0 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
114d0 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
114e0 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
114f0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
11500 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
11510 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
11520 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
11530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
11550 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
11560 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
11570 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11580 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
11590 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
115a0 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
115b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
115c0 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
115d0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
115e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
115f0 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
11600 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
11610 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
11620 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
11630 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
11640 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
11650 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
11660 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
11670 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
11680 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
11690 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
116a0 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
116b0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
116c0 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72  ** When a master
116d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
116e0 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20   created, it is 
116f0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
11700 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
11710 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
11720 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61   journals, one a
11730 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f  fter another, fo
11740 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38  rmatted as utf-8
11750 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78   .** encoded tex
11760 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61  t. The end of ea
11770 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
11780 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20   file is marked 
11790 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74  with a .** nul-t
117a0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28  erminator byte (
117b0 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20  0x00). i.e. the 
117c0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
117d0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
117e0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  nal.** file for 
117f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
11800 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61  volving two data
11810 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a  bases might be:.
11820 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62  **.**   "/home/b
11830 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/a.db-journal
11840 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62  \x00/home/bill/b
11850 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22  .db-journal\x00"
11860 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20  .**.** A master 
11870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
11880 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64   only be deleted
11890 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73   once all of its
118a0 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e   child .** journ
118b0 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f  als have been ro
118c0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
118d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
118e0 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  eads the content
118f0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  s of the master-
11900 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
11910 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  o .** memory and
11920 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65   loops through e
11930 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ach of the child
11940 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20   journal names. 
11950 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c  For.** each chil
11960 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68  d journal, it ch
11970 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  ecks if:.**.**  
11980 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
11990 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20  journal exists, 
119a0 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a  and if so.**   *
119b0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
119c0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61  urnal contains a
119d0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61   reference to ma
119e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ster journal .**
119f0 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65       file zMaste
11a00 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69  r.**.** If a chi
11a10 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
11a20 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74  e found that mat
11a30 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65  ches both of the
11a40 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f   criteria.** abo
11a50 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ve, this functio
11a60 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  n returns withou
11a70 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
11a80 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
11a90 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64  ** no such child
11aa0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
11ab0 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73  found, file zMas
11ac0 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66  ter is deleted f
11ad0 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d  rom.** the file-
11ae0 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c  system using sql
11af0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
11b00 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
11b10 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73  rror within this
11b20 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72   function, an er
11b30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
11b40 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  rned. This.** fu
11b50 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
11b60 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69   memory by calli
11b70 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ng sqlite3Malloc
11b80 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61  (). If an alloca
11b90 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  tion.** fails, S
11ba0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
11bb0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
11bc0 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20  se, if no IO or 
11bd0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a  malloc errors .*
11be0 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  * occur, SQLITE_
11bf0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
11c00 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  **.** TODO: This
11c10 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
11c20 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f  tes a single blo
11c30 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
11c40 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69  load.** the enti
11c50 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
11c60 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11c70 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75  l file. This cou
11c80 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c  ld be.** a coupl
11c90 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f  e of kilobytes o
11ca0 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c  r so - potential
11cb0 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ly larger than t
11cc0 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65  he page .** size
11cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ce0 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
11cf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
11d00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
11d10 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
11d20 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
11d30 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
11d40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11d50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
11d60 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
11d70 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20  _file *pMaster; 
11d80 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d     /* Malloc'd m
11d90 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
11da0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
11db0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
11dc0 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20  *pJournal;   /* 
11dd0 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a  Malloc'd child-j
11de0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
11df0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  riptor */.  char
11e00 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
11e10 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
11e20 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
11e30 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
11e40 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
11e50 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
11e60 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
11e70 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
11e80 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
11e90 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
11ea0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
11eb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11ec0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
11ed0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
11ee0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11ef0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
11f00 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
11f10 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
11f20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
11f30 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
11f40 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
11f50 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
11f60 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
11f70 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
11f80 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
11f90 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
11fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11fb0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
11fc0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
11fd0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
11fe0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
11ff0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
12000 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
12010 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12020 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
12030 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
12040 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
12050 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
12060 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
12070 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
12080 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
12090 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
120a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
120b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
120c0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
120d0 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
120e0 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
120f0 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
12100 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
12110 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
12120 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
12130 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
12140 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
12150 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
12160 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
12170 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
12180 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
12190 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
121a0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
121b0 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
121c0 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
121d0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
121e0 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61  3Malloc((int)nMa
121f0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
12200 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
12210 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
12220 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
12230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
12240 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
12250 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
12260 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
12270 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
12280 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
12290 61 6c 2b 31 5d 3b 0a 20 20 20 20 72 63 20 3d 20  al+1];.    rc = 
122a0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
122b0 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
122c0 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
122d0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
122e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
122f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
12300 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
12310 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
12320 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
12330 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61   0;..    zJourna
12340 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
12350 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
12360 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
12370 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
12380 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
12390 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
123a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
123b0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
123c0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
123d0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
123e0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66  xists);.      if
123f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12400 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12410 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
12420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12430 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
12440 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
12450 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
12460 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
12470 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
12480 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
12490 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
124a0 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
124b0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
124c0 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
124d0 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
124e0 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
124f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12500 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
12510 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
12520 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
12530 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
12540 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
12550 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
12560 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
12570 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
12580 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
12590 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
125a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
125b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
125c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
125d0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
125e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
125f0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
12600 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
12610 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
12620 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
12630 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
12640 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
12650 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12670 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
12680 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
12690 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
126a0 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
126b0 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
126c0 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
126d0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
126e0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
126f0 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
12700 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
12710 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
12720 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
12730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
12740 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
12750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12760 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
12770 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
12780 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
12790 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 73 71      }.  }. .  sq
127a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
127b0 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
127c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
127d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
127e0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
127f0 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
12800 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
12810 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
12820 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
12830 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
12840 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
12850 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
12860 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
12870 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
12880 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12890 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
128a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
128b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
128c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
128d0 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
128e0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
128f0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
12900 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
12910 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
12920 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
12930 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
12940 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
12950 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
12960 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
12970 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
12980 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
12990 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
129a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
129b0 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20  not open, or an 
129c0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
129d0 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74  s not.** held, t
129e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
129f0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
12a00 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  se, the size of 
12a10 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  the file is.** c
12a20 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20  hanged to nPage 
12a30 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61  pages (nPage*pPa
12a40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
12a50 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c  tes). If the fil
12a60 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20  e.** on disk is 
12a70 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
12a80 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
12a90 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
12aa0 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
12ab0 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
12ac0 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
12ad0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
12ae0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
12af0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
12b00 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
12b10 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
12b20 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
12b30 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
12b40 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
12b50 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
12b60 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
12b70 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
12b80 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
12b90 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
12ba0 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
12bb0 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
12bc0 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
12bd0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
12be0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
12bf0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
12c00 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
12c10 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
12c20 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
12c30 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
12c40 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12c50 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
12c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
12c70 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
12c80 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
12c90 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
12ca0 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
12cb0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
12cc0 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
12cd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12ce0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
12cf0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
12d00 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f  EXCLUSIVE && isO
12d10 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
12d20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65  ){.    i64 curre
12d30 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b  ntSize, newSize;
12d40 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  .    /* TODO: Is
12d50 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20   it safe to use 
12d60 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
12d70 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63   here? */.    rc
12d80 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
12d90 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
12da0 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
12db0 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
12dc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
12dd0 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
12de0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12df0 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
12e00 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
12e10 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
12e20 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
12e30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12e40 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
12e50 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
12e60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12e70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12e80 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
12e90 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
12ea0 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
12eb0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
12ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12ed0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
12ee0 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
12ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12f00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12f10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
12f20 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
12f30 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
12f40 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
12f50 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
12f60 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
12f70 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
12f80 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
12f90 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
12fa0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
12fb0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
12fc0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
12fd0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
12fe0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
12ff0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
13000 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
13010 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
13020 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
13030 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
13040 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
13050 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
13060 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
13070 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
13080 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
13090 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
130a0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
130b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
130c0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
130d0 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
130e0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
130f0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
13100 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
13110 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
13120 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
13130 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
13140 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
13150 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
13160 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
13170 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
13180 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
13190 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
131a0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
131b0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
131c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
131d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
131e0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
131f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13200 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
13210 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
13220 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
13230 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
13240 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
13250 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
13260 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
13270 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
13280 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
13290 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
132a0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
132b0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
132c0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
132d0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
132e0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
132f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
13300 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20  ctorSize<32 ){. 
13310 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
13320 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
13330 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13340 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
13350 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
13360 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
13370 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
13380 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
13390 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
133a0 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
133b0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
133c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
133d0 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
133e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
133f0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
13400 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
13410 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
13420 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
13430 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
13440 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
13450 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
13460 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
13470 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
13480 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
13490 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
134a0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
134b0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
134c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
134d0 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
134e0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
134f0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
13500 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
13510 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
13520 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
13530 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
13540 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
13550 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
13560 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
13570 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
13580 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
13590 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
135a0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
135b0 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
135c0 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
135d0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
135e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
135f0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
13600 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
13610 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
13620 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
13630 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
13640 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
13650 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
13660 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
13670 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
13680 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
13690 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
136a0 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
136b0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
136c0 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
136d0 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
136e0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
136f0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
13700 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
13710 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
13720 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
13730 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
13740 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
13750 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
13760 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
13770 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
13780 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
13790 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
137a0 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
137b0 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
137c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
137d0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
137e0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
137f0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
13800 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
13810 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
13820 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
13830 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
13840 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
13850 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
13860 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
13870 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
13880 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
13890 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
138a0 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
138b0 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
138c0 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
138d0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
138e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
138f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
13900 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
13910 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
13920 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
13930 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
13940 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
13950 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
13960 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
13970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13980 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
13990 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
139a0 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
139b0 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
139c0 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
139d0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
139e0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
139f0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
13a00 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
13a10 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
13a20 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
13a30 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
13a40 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
13a50 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
13a60 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
13a70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
13a80 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
13a90 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
13aa0 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
13ab0 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
13ac0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13ad0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
13ae0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
13af0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
13b00 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
13b10 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
13b20 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
13b30 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
13b40 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
13b50 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
13b60 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
13b70 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
13b80 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
13b90 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
13ba0 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
13bb0 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
13bc0 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
13bd0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
13be0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
13bf0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
13c00 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
13c10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
13c20 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
13c30 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
13c40 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
13c50 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
13c60 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
13c70 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
13c80 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
13c90 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13ca0 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
13cb0 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
13cc0 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
13cd0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
13ce0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
13cf0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
13d00 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
13d10 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
13d20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
13d30 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
13d40 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
13d50 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
13d60 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
13d70 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
13d80 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
13d90 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
13da0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
13db0 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
13dc0 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
13dd0 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
13de0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
13df0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
13e00 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
13e10 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
13e20 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
13e30 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
13e40 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
13e50 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
13e60 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
13e70 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
13e80 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
13e90 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
13ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
13eb0 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
13ec0 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
13ed0 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
13ee0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
13ef0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
13f00 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
13f10 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
13f20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
13f30 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
13f60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
13f70 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
13f80 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
13f90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13fa0 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
13fb0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
13fc0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
13fd0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
13fe0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
13ff0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
14000 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
14010 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
14020 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
14030 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
14060 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
14070 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14090 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
140a0 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
140b0 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
140c0 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
140d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
140e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
140f0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
14100 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
14110 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
14120 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
14130 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
14140 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
14150 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
14160 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
14170 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
14180 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
14190 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
141a0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
141b0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
141c0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
141d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
141e0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
141f0 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
14200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14210 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
14220 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
14230 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
14240 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
14250 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
14260 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
14270 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
14280 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
14290 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
142a0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
142b0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
142c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
142d0 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
142e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
142f0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
14300 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
14310 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
14320 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
14330 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
14340 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
14350 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
14360 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
14370 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
14380 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
14390 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
143a0 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
143b0 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
143c0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
143d0 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
143e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
143f0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
14400 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
14410 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
14420 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
14430 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
14440 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
14450 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
14460 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
14470 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
14480 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
14490 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
144a0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
144b0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
144c0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
144d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
144e0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
144f0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
14500 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
14510 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
14520 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
14530 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
14540 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
14550 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14560 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
14570 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14580 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
14590 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
145a0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
145b0 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
145c0 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
145d0 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
145e0 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
145f0 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
14600 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
14610 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
14620 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
14630 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
14640 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
14650 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
14660 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
14670 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
14680 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
14690 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
146a0 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
146b0 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
146c0 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
146d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
146e0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
146f0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
14700 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
14710 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
14720 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
14730 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
14740 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
14750 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
14760 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
14770 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
14780 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
14790 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
147a0 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
147b0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
147c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
147d0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
147e0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
147f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
14800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
14810 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
14820 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
14830 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
14840 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
14850 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
14860 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
14870 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
14880 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
14890 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
148a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
148b0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
148c0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
148d0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
148e0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
148f0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
14900 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
14910 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
14920 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
14930 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
14940 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14950 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
14960 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14970 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14980 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
14990 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
149a0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
149b0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
149c0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
149d0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
149e0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
149f0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
14a00 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
14a10 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
14a20 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
14a30 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
14a40 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
14a50 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
14a60 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
14a70 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
14a80 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
14a90 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
14aa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
14ab0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
14ac0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
14ad0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
14ae0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
14af0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
14b00 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
14b10 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
14b20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
14b30 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
14b40 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
14b50 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
14b60 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
14b70 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
14b80 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
14b90 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
14ba0 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
14bb0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
14bc0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
14bd0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
14be0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
14bf0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
14c00 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
14c10 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
14c20 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
14c30 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
14c40 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
14c50 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
14c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
14c70 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14c80 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
14c90 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
14ca0 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
14cb0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
14cc0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
14cd0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
14ce0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
14cf0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
14d00 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
14d10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
14d20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14d30 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
14d40 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
14d50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
14d60 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
14d70 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
14d80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
14d90 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
14da0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
14db0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
14dc0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14dd0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
14de0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
14df0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
14e00 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
14e10 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
14e20 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
14e30 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
14e40 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
14e50 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14e60 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14e70 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
14e80 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14e90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
14ea0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
14eb0 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
14ec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
14ee0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14f00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
14f10 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
14f20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
14f30 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
14f40 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
14f50 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
14f60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
14f70 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
14f80 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
14f90 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
14fa0 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
14fb0 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
14fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
14fd0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
14fe0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
14ff0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
15000 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
15010 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
15020 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
15030 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15040 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
15050 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
15070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
15080 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
15090 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
150a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
150b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
150c0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
150d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
150e0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
150f0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
15100 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
15110 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
15120 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
15130 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
15140 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
15150 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
15160 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
15170 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
15180 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
15190 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
151a0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
151b0 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
151c0 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
151d0 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
151e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
151f0 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
15200 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
15210 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
15220 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
15230 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
15240 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
15250 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
15260 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
15270 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
15290 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
152a0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
152b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
152c0 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
152d0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
152e0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
152f0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
15300 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
15310 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
15320 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
15330 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
15340 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
15350 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
15360 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
15370 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
15380 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
15390 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
153a0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
153b0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
153c0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
153d0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
153e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
153f0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
15400 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15410 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
15420 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
15430 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
15440 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
15450 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
15460 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15470 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
15480 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
15490 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
154a0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
154b0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
154c0 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
154d0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
154e0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
154f0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
15500 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
15510 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
15520 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
15530 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
15540 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
15550 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
15560 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
15570 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
15580 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15590 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
155a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
155b0 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
155c0 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
155d0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
155e0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
155f0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
15600 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
15610 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
15620 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
15630 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
15640 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
15650 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
15660 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
15670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
15680 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
15690 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
156a0 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
156b0 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
156c0 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
156d0 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
156e0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
156f0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
15700 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
15710 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
15720 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
15730 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
15740 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
15750 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
15760 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
15770 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
15780 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
15790 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
157a0 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
157b0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
157c0 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
157d0 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
157e0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
157f0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
15800 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
15810 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
15820 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
15830 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
15840 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
15850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15860 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
15870 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15880 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
15890 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
158a0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
158b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
158c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
158d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
158e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
158f0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15900 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
15910 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20  r->noSync==0 && 
15920 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
15930 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
15940 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15950 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
15960 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
15970 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
15980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15990 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  K && pPager->noS
159a0 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
159b0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
159c0 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
159d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
159e0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
159f0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
15a00 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
15a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15a20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
15a30 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
15a40 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
15a50 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73  !='\0');.    tes
15a60 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15a70 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
15a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15a90 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
15aa0 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
15ab0 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
15ac0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
15ad0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
15ae0 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
15af0 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
15b00 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
15b10 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
15b20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
15b30 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
15b40 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
15b50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
15b60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15b70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15b80 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
15b90 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
15ba0 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
15bb0 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
15bc0 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
15bd0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
15be0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
15bf0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
15c00 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
15c10 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
15c20 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
15c30 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
15c40 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
15c50 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
15c60 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
15c70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
15c80 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
15c90 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
15ca0 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
15cb0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
15cc0 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
15cd0 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
15ce0 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
15cf0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
15d00 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
15d10 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
15d20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
15d30 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
15d40 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
15d50 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
15d60 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
15d70 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
15d80 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
15d90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15da0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
15db0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
15dc0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15dd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
15de0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
15df0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
15e00 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15e20 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
15e30 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
15e40 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
15e50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f  ager; /* Pager o
15e60 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64  bject associated
15e70 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a   with page pPg *
15e80 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  /.  Pgno pgno = 
15e90 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20  pPg->pgno;      
15ea0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
15eb0 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  to read */.  int
15ec0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
15ee0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
15ef0 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20  t isInWal = 0;  
15f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15f10 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69 6e  ue if page is in
15f20 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69   log file */.  i
15f30 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
15f40 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
15f50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
15f60 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
15f70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
15f80 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
15f90 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
15fa0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
15fb0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
15fc0 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
15fd0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
15fe0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15ff0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
16000 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
16010 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
16020 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
16030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16040 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  E_OK;.  }..  if(
16050 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
16060 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ger) ){.    /* T
16070 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
16080 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
16090 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
160a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
160b0 33 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d  3WalRead(pPager-
160c0 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73  >pWal, pgno, &is
160d0 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67  InWal, pgsz, pPg
160e0 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
160f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16100 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b  K && !isInWal ){
16110 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
16120 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
16130 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
16140 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
16150 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
16160 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
16170 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
16180 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
16190 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
161a0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
161b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
161c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
161d0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
161e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
161f0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
16200 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
16210 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
16220 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
16230 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
16240 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
16250 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
16260 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
16270 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
16280 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
16290 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
162a0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
162b0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
162c0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
162d0 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
162e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
162f0 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
16300 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
16310 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
16320 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
16330 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
16340 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
16350 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
16360 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
16370 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
16380 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
16390 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
163a0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
163b0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
163c0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
163d0 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
163e0 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
163f0 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
16400 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
16410 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
16420 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
16430 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
16440 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61  ite noising equa
16450 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66  ling 16 bytes of
16460 20 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69   0xff is vanishi
16470 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20  ngly small so.  
16480 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64      ** we should
16490 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20   still be ok..  
164a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d      */.      mem
164b0 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69  set(pPager->dbFi
164c0 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69  leVers, 0xff, si
164d0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
164e0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
164f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
16500 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28  dbFileVers = &((
16510 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b  u8*)pPg->pData)[
16520 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  24];.      memcp
16530 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
16540 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
16550 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
16560 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
16570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45      }.  }.  CODE
16580 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
16590 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
165a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
165b0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
165c0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
165d0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
165e0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
165f0 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
16600 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
16610 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
16620 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
16630 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
16640 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
16650 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
16660 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
16670 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
16680 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
16690 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
166a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
166b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
166c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
166d0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
166e0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
166f0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
16700 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
16710 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
16720 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
16730 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
16740 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
16750 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
16760 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16770 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
16780 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
16790 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
167a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
167b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
167c0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
167d0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
167e0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
167f0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
16800 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
16810 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
16820 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
16830 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
16840 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
16850 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
16860 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
16870 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
16880 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
16890 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
168a0 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
168b0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
168c0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
168d0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
168e0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
168f0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
16900 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
16910 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
16920 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
16930 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
16940 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
16950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16960 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16970 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
16980 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
16990 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
169a0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
169b0 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
169c0 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
169d0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
169e0 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
169f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16a00 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
16a10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16a20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
16a30 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
16a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16a50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
16a60 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
16a70 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
16a80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
16a90 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
16aa0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
16ab0 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
16ac0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
16ad0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
16ae0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
16af0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
16b00 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
16b10 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
16b20 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
16b30 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
16b40 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
16b50 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
16b60 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
16b70 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
16b80 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
16b90 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
16ba0 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
16bb0 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
16bc0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
16bd0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
16be0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
16bf0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
16c00 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
16c10 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
16c20 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
16c30 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
16c40 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
16c50 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
16c60 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
16c70 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
16c80 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
16c90 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
16ca0 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
16cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16cc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16cd0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
16ce0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
16cf0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
16d00 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
16d10 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
16d20 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
16d30 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16d60 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
16d70 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
16d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
16d90 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
16da0 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
16db0 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
16dc0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
16dd0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
16de0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
16df0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
16e00 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
16e10 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
16e20 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
16e30 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
16e40 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
16e50 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
16e60 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
16e70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
16e80 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
16e90 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
16ea0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
16eb0 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
16ec0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
16ed0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
16ee0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
16ef0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
16f00 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
16f10 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
16f20 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
16f30 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
16f40 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
16f50 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
16f60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
16f70 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
16f80 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
16f90 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
16fa0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
16fb0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
16fc0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
16fd0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
16fe0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
16ff0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
17000 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
17010 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
17020 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
17030 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
17040 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
17050 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
17060 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
17070 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
17080 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
17090 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
170a0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
170b0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
170c0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
170d0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
170e0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
170f0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
17100 61 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74  anged. .*/ .stat
17110 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
17120 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
17130 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
17140 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
17150 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
17160 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
17170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17180 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
17190 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
171a0 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
171b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
171c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
171d0 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
171e0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
171f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17200 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
17210 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
17220 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c  */.  int sync_fl
17230 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
17240 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
17250 20 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28   pass to OsSync(
17260 29 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20  ) (or 0) */.){. 
17270 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
172a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
172b0 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20  ager->pWal );.  
172c0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
172d0 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
172e0 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
172f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
17300 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
17310 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c  sCommit, sync_fl
17320 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
17330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17340 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
17350 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
17360 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
17370 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
17380 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17390 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
173a0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
173b0 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
173c0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
173d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
173e0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
173f0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
17400 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
17410 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17420 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
17430 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
17440 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
17450 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
17460 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
17470 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
17480 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
17490 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
174a0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
174b0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
174c0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
174d0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
174e0 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
174f0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
17500 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
17510 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
17520 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
17530 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
17540 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
17550 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17570 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
17580 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
17590 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
175a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
175b0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
175c0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
175d0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
175e0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
175f0 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
17600 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
17610 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
17620 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
17630 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
17640 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
17650 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
17660 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
17670 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
17680 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
17690 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
176a0 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
176b0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
176c0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
176d0 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
176e0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
176f0 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
17700 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
17710 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
17720 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
17730 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
17740 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
17750 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
17760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
17770 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66  nt dummy;.    if
17780 28 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20  ( changed ){.   
17790 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
177a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
177b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
177c0 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
177d0 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
177e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
177f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
17800 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
17810 26 64 75 6d 6d 79 29 3b 0a 20 20 7d 0a 20 20 70  &dummy);.  }.  p
17820 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
17830 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20  AGER_SHARED;..  
17840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17850 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65  .** Check if the
17860 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74   *-wal file that
17870 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
17880 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
17890 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a  ned by pPager.**
178a0 20 65 78 69 73 74 73 2e 20 41 73 73 75 6d 69 6e   exists. Assumin
178b0 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  g no error occur
178c0 73 2c 20 73 65 74 20 2a 70 45 78 69 73 74 73 20  s, set *pExists 
178d0 74 6f 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  to 1 if the file
178e0 20 65 78 69 73 74 73 2c 0a 2a 2a 20 6f 72 20 30   exists,.** or 0
178f0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 64 20 72   otherwise and r
17900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
17910 20 49 66 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d   If an IO or OOM
17920 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
17930 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69  eturn.** an SQLi
17940 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
17950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17960 65 72 48 61 73 57 41 4c 28 50 61 67 65 72 20 2a  erHasWAL(Pager *
17970 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
17980 69 73 74 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ists){.  int rc;
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
179b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
179c0 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
179e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 57 41 4c 20  Name of the WAL 
179f0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
17a00 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
17a10 46 69 6c 65 20 29 3b 0a 20 20 7a 57 61 6c 20 3d  File );.  zWal =
17a20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
17a30 28 22 25 73 2d 77 61 6c 22 2c 20 70 50 61 67 65  ("%s-wal", pPage
17a40 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
17a50 20 69 66 28 20 21 7a 57 61 6c 20 29 7b 0a 20 20   if( !zWal ){.  
17a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17a70 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
17a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17a90 41 63 63 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Access(pPager->p
17aa0 56 66 73 2c 20 7a 57 61 6c 2c 20 53 51 4c 49 54  Vfs, zWal, SQLIT
17ab0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
17ac0 20 70 45 78 69 73 74 73 29 3b 0a 20 20 20 20 73   pExists);.    s
17ad0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 61 6c  qlite3_free(zWal
17ae0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17af0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
17b00 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
17b10 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
17b20 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
17b30 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
17b40 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
17b50 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6f 70  . If it does, op
17b60 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 6e 20  en the pager in 
17b70 57 41 4c 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77  WAL mode. Otherw
17b80 69 73 65 2c 20 69 66 20 6e 6f 20 65 72 72 6f 72  ise, if no error
17b90 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65  .** occurs, make
17ba0 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72   sure Pager.jour
17bb0 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73  nalMode is not s
17bc0 65 74 20 74 6f 20 50 41 47 45 52 5f 4a 4f 55 52  et to PAGER_JOUR
17bd0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 20  NALMODE_WAL..** 
17be0 49 66 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20  If an IO or OOM 
17bf0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17c00 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
17c10 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
17c20 20 49 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   If the WAL file
17c30 20 69 73 20 6f 70 65 6e 65 64 2c 20 61 6c 73 6f   is opened, also
17c40 20 6f 70 65 6e 20 61 20 73 6e 61 70 73 68 6f 74   open a snapshot
17c50 20 28 72 65 61 64 20 74 72 61 6e 73 61 63 74 69   (read transacti
17c60 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  on)..**.** The c
17c70 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
17c80 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
17c90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17ca0 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
17cb0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
17cc0 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
17cd0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
17ce0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
17cf0 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
17d00 61 20 57 41 4c 2c 20 74 68 69 73 20 65 6e 73 75  a WAL, this ensu
17d10 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
17d20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 62  race condition b
17d30 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
17d40 73 73 28 29 20 0a 2a 2a 20 62 65 6c 6f 77 20 61  ss() .** below a
17d50 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
17d60 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
17d70 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  y some other con
17d80 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
17d90 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
17da0 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
17db0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17dc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17dd0 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
17de0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
17df0 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20    int isWal;    
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66  /* True if WAL f
17e20 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
17e30 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73 57    rc = pagerHasW
17e40 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73 57 61  AL(pPager, &isWa
17e50 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
17e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17e70 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
17e80 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
17e90 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
17ea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17eb0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
17ec0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
17ed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17ef0 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
17f00 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
17f10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17f20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
17f30 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
17f40 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
17f50 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
17f60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17f70 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
17f80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
17f90 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
17fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17fb0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
17fc0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
17fd0 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
17fe0 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
17ff0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
18000 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
18010 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
18020 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
18030 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
18040 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
18050 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
18060 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
18070 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
18080 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
18090 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
180a0 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
180b0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
180c0 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
180d0 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
180e0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
180f0 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
18100 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
18110 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
18120 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
18130 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
18140 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
18150 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
18160 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
18170 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
18180 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
18190 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
181a0 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
181b0 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
181c0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
181d0 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
181e0 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
181f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
18200 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
18210 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
18220 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
18230 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
18240 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18250 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
18260 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
18270 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18280 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
18290 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
182a0 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
182b0 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
182c0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
182d0 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
182e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
182f0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
18300 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
18310 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
18320 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
18330 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
18340 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
18350 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
18360 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
18370 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
18380 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
18390 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
183a0 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
183b0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
183c0 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
183d0 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
183e0 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
183f0 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
18400 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
18410 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
18420 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
18430 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
18440 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
18450 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
18460 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
18470 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
18480 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
18490 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
184a0 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
184b0 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
184c0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
184d0 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
184e0 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
184f0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
18500 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
18510 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
18520 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
18530 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
18540 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
18550 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
18560 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
18570 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
18580 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
18590 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
185a0 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
185b0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
185c0 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
185d0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
185e0 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
185f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
18600 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
18610 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
18620 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
18630 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
18640 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
18650 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
18660 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
18670 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
18680 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
18690 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
186a0 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
186b0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
186c0 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
186d0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
186e0 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18700 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
18710 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
18720 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
18730 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
18740 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
18750 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
18760 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
18770 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
18780 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
18790 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
187a0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
187b0 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
187c0 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
187d0 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
187e0 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
187f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
18800 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
18810 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
18820 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
18830 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
18840 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
18850 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
18860 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
18870 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
18880 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
18890 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
188a0 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
188b0 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
188c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
188d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
188e0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
188f0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
18900 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
18910 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
18920 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
18930 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
18940 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
18950 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
18960 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
18970 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
18980 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
18990 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 69 66 28  OrigSize;..  if(
189a0 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20   !pSavepoint && 
189b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
189c0 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
189d0 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  n pagerRollbackW
189e0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
189f0 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
18a00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
18a10 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
18a20 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
18a30 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
18a40 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
18a50 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
18a60 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
18a70 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
18a80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
18a90 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
18aa0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
18ab0 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
18ac0 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
18ad0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
18ae0 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
18af0 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
18b00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18b10 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  f;.  assert( pag
18b20 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
18b30 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b  ==0 || szJ==0 );
18b40 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
18b50 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
18b60 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
18b70 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
18b80 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
18b90 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
18ba0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
18bb0 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
18bc0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
18bd0 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
18be0 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
18bf0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
18c00 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
18c10 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
18c20 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
18c30 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
18c40 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
18c50 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
18c60 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
18c70 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
18c80 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
18c90 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
18ca0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
18cb0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
18cc0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26  if( pSavepoint &
18cd0 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  & !pagerUseWal(p
18ce0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48  Pager) ){.    iH
18cf0 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  drOff = pSavepoi
18d00 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f  nt->iHdrOffset ?
18d10 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
18d20 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20  rOffset : szJ;. 
18d30 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
18d40 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69  alOff = pSavepoi
18d50 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20  nt->iOffset;.   
18d60 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
18d70 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
18d80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72  >journalOff<iHdr
18d90 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Off ){.      rc 
18da0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
18db0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
18dc0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
18dd0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
18de0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
18df0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
18e00 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73  E_DONE );.  }els
18e10 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  e{.    pPager->j
18e20 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
18e30 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75   }..  /* Continu
18e40 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  e rolling back r
18e50 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68  ecords out of th
18e60 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
18e70 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
18e80 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
18e90 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e  l header seen an
18ea0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74  d continuing unt
18eb0 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65  il the effective
18ec0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65   end.  ** of the
18ed0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
18ee0 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f  le.  Continue to
18ef0 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e   skip out-of-ran
18f00 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a  ge pages and.  *
18f10 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e  * continue addin
18f20 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  g pages rolled b
18f30 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20  ack to pDone..  
18f40 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  */.  while( rc==
18f50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
18f60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
18f70 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69  szJ ){.    u32 i
18f80 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
18f90 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18fa0 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d  .    u32 nJRec =
18fb0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
18fc0 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
18fd0 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
18fe0 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
18ff0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
19000 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26  Pager, 0, szJ, &
19010 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  nJRec, &dummy);.
19020 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
19030 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a  SQLITE_DONE );..
19040 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
19050 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e "pPager->journ
19060 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
19070 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
19080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19090 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73  ".    ** test is
190a0 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b   related to tick
190b0 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74  et #2565.  See t
190c0 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e  he discussion in
190d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
190e0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e  r_playback() fun
190f0 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69  ction for additi
19100 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
19110 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19120 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20   nJRec==0 .     
19130 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
19140 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
19150 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
19160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19170 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a  .    ){.      nJ
19180 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a  Rec = (u32)((szJ
19190 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
191a0 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50  alOff)/JOURNAL_P
191b0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
191c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
191d0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
191e0 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20   && ii<nJRec && 
191f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19200 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20  ff<szJ; ii++){. 
19210 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19220 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19230 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19240 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19250 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19260 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19270 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19280 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
192a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
192b0 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f  Off>=szJ );..  /
192c0 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c  * Finally,  roll
192d0 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20  back pages from 
192e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
192f0 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65    Page that were
19300 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
19310 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74   rolled back out
19320 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
19330 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65  rnal (and are he
19340 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20  nce in pDone).  
19350 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
19360 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67  ed.  Out-of-rang
19370 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f  e pages are also
19380 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
19390 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
193a0 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
193b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
193c0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
193d0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70 53   i64 offset = pS
193e0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
193f0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
19400 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
19410 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
19420 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
19430 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
19440 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
19450 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
19460 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
19470 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
19480 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
19490 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
194a0 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
194b0 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
194c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
194d0 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50  offset==ii*(4+pP
194e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
194f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
19500 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
19510 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f  _page(pPager, &o
19520 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c  ffset, pDone, 0,
19530 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
19540 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19550 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
19560 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
19570 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
19580 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19590 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
195a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
195b0 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  J;.  }..  return
195c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
195d0 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
195e0 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
195f0 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
19600 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
19610 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19620 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
19630 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
19640 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
19650 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
19660 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
19670 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
19680 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
19690 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
196a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
196b0 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
196c0 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
196d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
196e0 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
196f0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
19700 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
19710 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
19720 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
19730 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
19740 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
19750 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
19760 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
19770 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
19780 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
19790 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
197a0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
197b0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
197c0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
197d0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
197e0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
197f0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19800 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19810 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
19820 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
19830 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
19840 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
19850 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
19860 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
19870 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
19880 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
19890 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
198a0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
198b0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
198c0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
198d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
198e0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
198f0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
19900 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
19910 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
19920 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
19930 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
19940 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
19950 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
19960 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
19970 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
19980 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19990 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
199a0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
199b0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
199c0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
199d0 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
199e0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
199f0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
19a00 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
19a10 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
19a20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
19a30 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
19a40 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
19a50 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
19a60 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
19a70 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
19a80 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
19a90 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
19aa0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
19ab0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
19ac0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
19ad0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
19ae0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
19af0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
19b00 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
19b10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
19b20 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
19b30 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
19b40 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
19b50 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
19b60 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
19b70 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
19b80 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
19b90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
19ba0 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
19bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
19bc0 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
19bd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
19be0 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46  evel, int bFullF
19bf0 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
19c00 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65  >noSync =  (leve
19c10 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
19c20 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
19c30 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
19c40 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26  nc = (level==3 &
19c50 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
19c60 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61  ile) ?1:0;.  pPa
19c70 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
19c80 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51  = (bFullFsync?SQ
19c90 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53  LITE_SYNC_FULL:S
19ca0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
19cb0 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  L);.  if( pPager
19cc0 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
19cd0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
19ce0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19cf0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
19d00 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
19d10 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
19d20 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
19d30 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
19d40 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
19d50 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
19d60 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
19d70 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
19d80 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
19d90 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
19da0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
19db0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
19dc0 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
19dd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
19de0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
19df0 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
19e00 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19e10 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
19e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19e30 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
19e40 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
19e50 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
19e60 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
19e70 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
19e80 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
19e90 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
19ea0 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
19eb0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
19ec0 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
19ed0 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
19ee0 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
19ef0 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
19f00 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
19f10 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
19f20 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
19f30 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19f40 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
19f50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
19f60 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
19f70 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
19f80 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
19f90 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
19fa0 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
19fb0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
19fc0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
19fd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
19fe0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
19ff0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
1a000 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
1a010 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1a020 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
1a030 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
1a040 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
1a050 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
1a060 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
1a070 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a080 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1a090 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
1a0a0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
1a0b0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
1a0c0 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
1a0d0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
1a0e0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
1a0f0 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
1a100 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
1a110 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1a120 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a130 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
1a140 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1a150 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
1a160 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1a170 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
1a180 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
1a190 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
1a1a0 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
1a1b0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1a1c0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
1a1d0 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
1a1e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a1f0 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
1a200 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
1a210 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
1a220 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
1a230 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
1a240 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
1a250 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
1a260 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
1a270 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
1a280 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
1a290 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
1a2a0 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
1a2b0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1a2c0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
1a2d0 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
1a2e0 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
1a2f0 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
1a300 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
1a310 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
1a320 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
1a330 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
1a340 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
1a350 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
1a360 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
1a370 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
1a380 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
1a390 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
1a3a0 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
1a3d0 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
1a3e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a3f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a410 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
1a420 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
1a430 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
1a440 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
1a450 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
1a460 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
1a470 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
1a480 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
1a490 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
1a4a0 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
1a4b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
1a4c0 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
1a4d0 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
1a4e0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
1a4f0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
1a500 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
1a510 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
1a520 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
1a530 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1a540 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
1a550 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1a560 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
1a570 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
1a580 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1a590 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
1a5a0 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
1a5b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1a5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1a5d0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1a5e0 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
1a5f0 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
1a600 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1a610 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
1a620 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
1a630 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
1a640 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
1a650 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
1a660 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
1a670 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
1a680 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1a690 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
1a6a0 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
1a6b0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
1a6c0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
1a6d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
1a6e0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
1a6f0 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
1a700 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
1a710 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
1a720 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
1a730 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
1a740 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
1a750 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
1a760 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a770 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
1a780 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
1a790 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
1a7a0 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
1a7b0 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
1a7c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
1a7f0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
1a800 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
1a810 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
1a820 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
1a830 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
1a840 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
1a850 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  dec */.#endif../
1a860 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1a870 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
1a880 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
1a890 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
1a8a0 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
1a8b0 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
1a8c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
1a8d0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
1a8e0 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
1a8f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1a900 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
1a910 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
1a920 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
1a930 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
1a940 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
1a950 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
1a960 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
1a970 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
1a980 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
1a990 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1a9a0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
1a9b0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
1a9c0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
1a9d0 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
1a9e0 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
1a9f0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
1aa00 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
1aa10 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
1aa20 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
1aa30 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
1aa40 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
1aa50 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
1aa60 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
1aa70 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
1aa80 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
1aa90 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
1aaa0 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
1aab0 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
1aac0 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
1aad0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1aae0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
1aaf0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
1ab00 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
1ab10 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
1ab20 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
1ab30 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
1ab40 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
1ab50 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
1ab60 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
1ab70 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
1ab80 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
1ab90 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
1aba0 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
1abb0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
1abc0 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
1abd0 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
1abe0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
1abf0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
1ac00 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
1ac10 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
1ac20 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
1ac30 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
1ac40 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ac50 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
1ac60 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
1ac70 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
1ac80 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
1ac90 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
1aca0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
1acb0 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
1acc0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1acd0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
1ace0 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
1acf0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
1ad00 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
1ad10 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1ad20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
1ad30 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
1ad40 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
1ad50 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
1ad60 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
1ad70 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1ad80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
1ad90 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
1ada0 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
1adb0 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
1adc0 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
1add0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1ade0 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ode;..  if( rc==
1adf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ae00 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20   u16 pageSize = 
1ae10 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  *pPageSize;.    
1ae20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
1ae30 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
1ae40 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
1ae50 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
1ae60 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20  GE_SIZE) );.    
1ae70 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
1ae80 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
1ae90 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20  >dbSize==0).    
1aea0 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
1aeb0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
1aec0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
1aed0 20 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20      && pageSize 
1aee0 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61  && pageSize!=pPa
1aef0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
1af00 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72     ){.      char
1af10 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   *pNew = (char *
1af20 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
1af30 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
1af40 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b      if( !pNew ){
1af50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1af60 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1af70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1af80 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1af90 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  ger);.        pP
1afa0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
1afb0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
1afc0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
1afd0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
1afe0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  pace);.        p
1aff0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1b000 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
1b010 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
1b020 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
1b030 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
1b040 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1b050 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69    }.    *pPageSi
1b060 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  ze = (u16)pPager
1b070 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1b080 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
1b090 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
1b0a0 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
1b0b0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
1b0c0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
1b0d0 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
1b0e0 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
1b0f0 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
1b100 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
1b110 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
1b120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b130 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1b140 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
1b150 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
1b160 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
1b170 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
1b180 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
1b190 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
1b1a0 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
1b1b0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
1b1c0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
1b1d0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
1b1e0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
1b1f0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
1b200 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
1b210 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
1b220 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
1b230 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
1b240 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
1b250 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
1b260 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
1b270 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
1b280 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
1b290 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
1b2a0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
1b2b0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
1b2c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1b2d0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
1b2e0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
1b2f0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
1b300 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
1b310 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
1b320 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
1b330 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
1b340 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
1b350 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
1b360 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
1b370 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
1b380 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
1b390 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
1b3a0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1b3b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1b3c0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
1b3d0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
1b3e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
1b3f0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
1b400 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b410 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
1b420 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
1b430 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
1b440 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 69 66 28  int nPage;.  if(
1b450 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
1b460 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1b470 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
1b480 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b490 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1b4a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
1b4b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1b4c0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1b4d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b4e0 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61 67 65 20  ->mxPgno>=nPage 
1b4f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1b500 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
1b510 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1b520 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
1b530 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
1b540 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
1b550 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
1b560 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
1b570 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
1b580 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
1b590 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
1b5a0 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
1b5b0 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
1b5c0 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
1b5d0 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
1b5e0 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
1b5f0 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
1b600 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
1b610 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
1b620 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
1b630 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1b640 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
1b650 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
1b660 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
1b670 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
1b680 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
1b690 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
1b6a0 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
1b6b0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
1b6c0 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
1b6d0 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
1b6e0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
1b6f0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
1b700 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
1b710 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
1b720 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
1b730 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
1b740 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b750 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
1b760 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
1b770 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
1b780 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1b790 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
1b7a0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
1b7b0 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
1b7c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1b7d0 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
1b7e0 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
1b7f0 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
1b800 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
1b810 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
1b820 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  o. .**.** If the
1b830 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65   pager was opene
1b840 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74  d on a transient
1b850 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65   file (zFilename
1b860 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65  ==""), or.** ope
1b870 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65  ned on a file le
1b880 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20  ss than N bytes 
1b890 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74  in size, the out
1b8a0 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  put buffer is.**
1b8b0 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49   zeroed and SQLI
1b8c0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
1b8d0 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f  The rationale fo
1b8e0 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
1b8f0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1b900 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1b910 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
1b920 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61  s, and a new tra
1b930 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72  nsient or.** zer
1b940 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65  o sized database
1b950 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68   has a header th
1b960 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69  an consists enti
1b970 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a  rely of zeroes..
1b980 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20  **.** If any IO 
1b990 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d  error apart from
1b9a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1b9b0 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f  ORT_READ is enco
1b9c0 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20  untered,.** the 
1b9d0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1b9e0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1b9f0 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e  ller and the con
1ba00 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
1ba10 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e  output buffer un
1ba20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  defined..*/.int 
1ba30 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
1ba40 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
1ba50 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
1ba60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1ba70 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
1ba80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ba90 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
1baa0 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69   N);.  assert( i
1bab0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1bac0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1bad0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 54  pFile );..  /* T
1bae0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
1baf0 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 62 74  nly called by bt
1bb00 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ree immediately 
1bb10 61 66 74 65 72 20 63 72 65 61 74 69 6e 67 0a 20  after creating. 
1bb20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20 6f 62   ** the Pager ob
1bb30 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68 61 73  ject.  There has
1bb40 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f 70 70   not been an opp
1bb50 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 61 6e  ortunity to tran
1bb60 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57  sition.  ** to W
1bb70 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20 20 2a  AL mode yet..  *
1bb80 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
1bb90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1bba0 20 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 28 20   );.#if 0.  if( 
1bbb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1bbc0 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  er) ){.    int i
1bbd0 73 49 6e 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20  sInWal = 0;.    
1bbe0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1bbf0 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ead(pPager->pWal
1bc00 2c 20 31 2c 20 26 69 73 49 6e 57 61 6c 2c 20 4e  , 1, &isInWal, N
1bc10 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66  , pDest);.    if
1bc20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bc30 7c 7c 20 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20  || isInWal ){.  
1bc40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bc50 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1bc60 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1bc70 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1bc80 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
1bc90 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
1bca0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
1bcb0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1bcc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
1bcd0 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
1bce0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1bcf0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1bd00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1bd10 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1bd20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bd30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1bd40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1bd50 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1bd60 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
1bd70 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
1bd80 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c   pPager. Normall
1bd90 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75  y, this is calcu
1bda0 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69  lated as (<db fi
1bdb0 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73  le size>/<page-s
1bdc0 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65  ize>)..** Howeve
1bdd0 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
1bde0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1bdf0 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
1be00 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
1be10 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
1be20 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
1be30 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
1be40 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
1be50 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
1be60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1be70 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
1be80 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65  e.** error state
1be90 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1bea0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
1beb0 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67  age left unchang
1bec0 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68  ed. Or,.** if th
1bed0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61  e file system ha
1bee0 73 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20  s to be queried 
1bef0 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20  for the size of 
1bf00 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  the file and.** 
1bf10 74 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70  the query attemp
1bf20 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20  t returns an IO 
1bf30 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72  error, the IO er
1bf40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1bf50 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
1bf60 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
1bf70 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  anged..**.** Oth
1bf80 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
1bf90 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
1bfa0 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ful, then SQLITE
1bfb0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
1bfc0 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
1bfd0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1bfe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1bff0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1c000 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c010 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
1c020 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
1c030 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
1c040 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
1c050 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1c060 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1c070 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65  ge */..  /* Dete
1c080 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
1c090 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1c0a0 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
1c0b0 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
1c0c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c0d0 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
1c0e0 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
1c0f0 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
1c100 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c120 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
1c130 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
1c140 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c160 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
1c170 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
1c180 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
1c190 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
1c1a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
1c1b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c1c0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c1d0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 44       sqlite3WalD
1c1e0 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1c1f0 61 6c 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  al, &nPage);.   
1c200 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 50 61 67   }..    if( nPag
1c210 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  e==0 ){.      as
1c220 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1c230 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1c240 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1c250 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e        if( isOpen
1c260 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
1c270 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
1c280 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
1c290 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1c2a0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 20  Pager->fd, &n)) 
1c2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
1c2c0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1c2d0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
1c2e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c2f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c300 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
1c310 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c320 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67   ){.        nPag
1c330 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
1c340 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67  se{.        nPag
1c350 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
1c360 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c380 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c390 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c3a0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
1c3b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1c3c0 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  age;.      pPage
1c3d0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1c3e0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61  nPage;.      pPa
1c3f0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c400 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1c410 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1c420 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1c430 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1c440 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1c450 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69   the .  ** confi
1c460 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61  gured maximum pa
1c470 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72  ger number, incr
1c480 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64  ease the allowed
1c490 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74   limit so.  ** t
1c4a0 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e  hat the file can
1c4b0 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20   be read..  */. 
1c4c0 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65   if( nPage>pPage
1c4d0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
1c4e0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
1c4f0 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20  = (Pgno)nPage;. 
1c500 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
1c510 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1c520 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1c530 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61  TE_OK */.  *pnPa
1c540 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1c550 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c560 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
1c570 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
1c580 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
1c590 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c5a0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
1c5b0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
1c5c0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
1c5d0 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
1c5e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
1c5f0 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
1c600 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
1c610 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
1c620 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
1c630 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
1c640 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
1c650 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
1c660 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
1c670 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
1c680 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
1c690 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
1c6a0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
1c6b0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1c6c0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
1c6d0 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
1c6e0 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
1c6f0 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
1c700 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
1c710 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1c720 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
1c730 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
1c740 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
1c750 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
1c760 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
1c770 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
1c780 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
1c790 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
1c7a0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
1c7b0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c7c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c7d0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1c7e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1c7f0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
1c800 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c830 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
1c840 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
1c850 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
1c860 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
1c870 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
1c880 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
1c890 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
1c8a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
1c8b0 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
1c8c0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
1c8d0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
1c8e0 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
1c8f0 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
1c900 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
1c910 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
1c920 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
1c930 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
1c940 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n. It.  ** must 
1c950 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  not have been mo
1c960 64 69 66 69 65 64 20 61 74 20 74 68 69 73 20 70  dified at this p
1c970 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  oint..  */.  ass
1c980 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1c990 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1c9a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
1c9b0 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20  zeValid==0 );.  
1c9c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c9d0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1c9e0 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
1c9f0 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a  bModified==0 );.
1ca00 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1ca10 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
1ca20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
1ca30 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1ca40 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
1ca50 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
1ca60 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
1ca70 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
1ca80 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
1ca90 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
1caa0 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
1cab0 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
1cac0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
1cad0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
1cae0 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
1caf0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
1cb00 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
1cb10 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
1cb20 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1cb30 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63  ER_UNLOCK && loc
1cb40 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41  ktype==PAGER_SHA
1cb50 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  RED).       || (
1cb60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1cb70 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26  AGER_RESERVED &&
1cb80 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
1cb90 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b  _EXCLUSIVE).  );
1cba0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1cbb0 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
1cbc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1cbd0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1cbe0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
1cbf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1cc00 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
1cc10 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
1cc20 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1cc30 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
1cc40 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
1cc50 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
1cc60 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28  rArg) );.    if(
1cc70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cc80 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1cc90 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b  state = (u8)lock
1cca0 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
1ccb0 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
1ccc0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
1ccd0 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
1cce0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ccf0 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
1cd00 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1cd10 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
1cd20 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
1cd30 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
1cd40 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
1cd50 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
1cd60 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
1cd70 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
1cd80 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
1cd90 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
1cda0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1cdb0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1cdc0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
1cdd0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
1cde0 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
1cdf0 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
1ce00 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1ce10 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
1ce20 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
1ce30 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
1ce40 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1ce50 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1ce60 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
1ce70 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1ce80 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
1ce90 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
1cea0 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
1ceb0 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
1cec0 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
1ced0 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
1cee0 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
1cef0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
1cf00 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
1cf10 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
1cf20 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
1cf30 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
1cf40 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
1cf50 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
1cf60 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
1cf70 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1cf80 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
1cf90 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1cfa0 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
1cfb0 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
1cfc0 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
1cfd0 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
1cfe0 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
1cff0 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72 20  rrect behaviour 
1d000 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
1d010 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
1d020 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
1d030 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
1d040 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
1d050 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
1d060 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
1d070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d080 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
1d090 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1d0a0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
1d0b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
1d0c0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
1d0d0 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
1d0e0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
1d0f0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
1d100 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
1d110 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
1d120 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
1d130 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
1d140 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
1d150 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
1d160 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1d170 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
1d180 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
1d190 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
1d1a0 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
1d1b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
1d1c0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
1d1d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
1d1e0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1d1f0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
1d200 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
1d210 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
1d220 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
1d230 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d240 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1d250 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
1d260 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
1d270 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
1d280 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1d290 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
1d2a0 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
1d2b0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
1d2c0 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
1d2d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
1d2e0 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
1d2f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1d300 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
1d310 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
1d320 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
1d330 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
1d340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d350 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
1d360 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
1d370 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
1d380 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
1d390 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
1d3a0 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
1d3b0 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
1d3c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1d3d0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
1d3e0 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
1d3f0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1d400 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
1d410 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
1d420 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
1d430 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1d440 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
1d450 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
1d460 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1d470 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1d480 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1d490 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
1d4a0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61  ize = nPage;.  a
1d4b0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d4c0 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
1d4d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1d4e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d4f0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1d500 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
1d510 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
1d520 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
1d530 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
1d540 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
1d550 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1d560 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
1d570 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1d580 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
1d590 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
1d5a0 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
1d5b0 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
1d5c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1d5d0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
1d5e0 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
1d5f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
1d600 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
1d610 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
1d620 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
1d630 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1d640 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
1d650 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
1d660 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
1d670 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
1d680 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
1d690 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
1d6a0 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
1d6b0 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
1d6c0 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
1d6d0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
1d6e0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
1d6f0 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
1d700 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d710 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
1d720 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
1d730 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
1d740 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
1d750 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
1d760 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d780 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1d790 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
1d7a0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1d7b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
1d7c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
1d7d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d7e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d7f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1d800 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1d810 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
1d820 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
1d830 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d840 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
1d850 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
1d860 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
1d870 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
1d880 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
1d890 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
1d8a0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
1d8b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1d8c0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
1d8d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1d8e0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
1d8f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
1d900 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
1d910 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
1d920 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
1d930 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1d940 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
1d950 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
1d960 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
1d970 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1d980 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
1d990 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
1d9a0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
1d9b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1d9c0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
1d9d0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
1d9e0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
1d9f0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
1da00 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
1da10 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
1da20 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
1da30 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
1da40 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
1da50 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
1da60 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
1da70 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
1da80 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
1da90 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
1daa0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
1dab0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1dac0 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
1dad0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
1dae0 70 53 70 61 63 65 3b 0a 0a 20 20 64 69 73 61 62  pSpace;..  disab
1daf0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
1db00 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
1db10 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
1db20 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
1db30 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
1db40 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
1db50 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
1db60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1db70 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  WAL.  sqlite3Wal
1db80 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
1db90 61 6c 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d  al,.    (pPager-
1dba0 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50  >noSync ? 0 : pP
1dbb0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1dbc0 29 2c 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ), .    pPager->
1dbd0 70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20  pageSize, pTmp. 
1dbe0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57   );.  pPager->pW
1dbf0 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
1dc00 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1dc10 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
1dc20 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
1dc30 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
1dc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
1dc50 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  et Pager.journal
1dc60 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68  Hdr to -1 for th
1dc70 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65  e benefit of the
1dc80 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1dc90 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ) .    ** call w
1dca0 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65  hich may be made
1dcb0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
1dcc0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
1dcd0 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20  ack(). If it.   
1dce0 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74   ** is not -1, t
1dcf0 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64  hen the unsynced
1dd00 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f   portion of an o
1dd10 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
1dd20 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70   may.    ** be p
1dd30 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
1dd40 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1dd50 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
1dd60 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20   occurs while.  
1dd70 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
1dd80 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
1dd90 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  base may become 
1dda0 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a  corrupt..    */.
1ddb0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1ddc0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
1ddd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
1dde0 43 6f 64 65 20 3d 20 70 61 67 65 72 53 79 6e 63  Code = pagerSync
1ddf0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
1de00 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  r);.    }.    pa
1de10 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
1de20 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1de30 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
1de40 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1de50 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
1de60 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
1de70 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
1de80 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
1de90 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
1dea0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
1deb0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1dec0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1ded0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1dee0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1def0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
1df00 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 54  lite3PageFree(pT
1df10 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  mp);.  sqlite3Pc
1df20 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
1df30 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
1df40 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
1df50 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67 65  ODEC.  if( pPage
1df60 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
1df70 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
1df80 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
1df90 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  c);.#endif..  as
1dfa0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61  sert( !pPager->a
1dfb0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50  Savepoint && !pP
1dfc0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1dfd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
1dfe0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1dff0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
1e000 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a  ager->sjfd) );..
1e010 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e020 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1e030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1e040 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
1e050 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1e060 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
1e070 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
1e080 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67  e number for pag
1e090 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73  e pPg..*/.Pgno s
1e0a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
1e0b0 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 50  umber(DbPage *pP
1e0c0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
1e0d0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
1e0e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
1e0f0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
1e100 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70  count for page p
1e110 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Pg..*/.void sqli
1e120 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
1e130 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
1e140 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
1e150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
1e160 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e   the journal. In
1e170 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
1e180 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
1e190 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
1e1a0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1e1b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
1e1c0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
1e1d0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
1e1e0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   of the.** disk 
1e1f0 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f  and can be resto
1e200 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
1e210 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
1e220 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  l rollback..**.*
1e230 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
1e240 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1e250 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68  not set, then th
1e260 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1e270 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  .** no-op. Other
1e280 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e  wise, the action
1e290 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e  s required depen
1e2a0 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1e2b0 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65  -mode.** and the
1e2c0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1e2d0 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 74  ristics of the t
1e2e0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
1e2f0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1e300 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
1e310 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
1e320 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e330 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
1e340 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
1e350 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
1e360 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1e370 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
1e380 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
1e390 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
1e3a0 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
1e3b0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
1e3c0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1e3d0 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
1e3e0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
1e3f0 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
1e400 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
1e410 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
1e420 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
1e430 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
1e440 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
1e450 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
1e460 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
1e470 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
1e480 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
1e490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1e4a0 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
1e4b0 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
1e4c0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
1e4d0 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
1e4e0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
1e4f0 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
1e500 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
1e510 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
1e520 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
1e530 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
1e540 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
1e550 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
1e560 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
1e570 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
1e580 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
1e590 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
1e5a0 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
1e5b0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
1e5c0 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
1e5d0 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
1e5e0 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
1e5f0 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
1e600 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
1e610 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
1e620 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61    }.**.** The Pa
1e630 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
1e640 67 20 69 73 20 6e 65 76 65 72 20 62 65 20 73 65  g is never be se
1e650 74 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  t for temporary 
1e660 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a  files, or any.**
1e670 20 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20   file operating 
1e680 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  in no-sync mode 
1e690 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65  (Pager.noSync se
1e6a0 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a  t to non-zero)..
1e6b0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1e6c0 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
1e6d0 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
1e6e0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
1e6f0 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
1e700 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
1e710 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
1e720 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
1e730 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1e740 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
1e750 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
1e760 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
1e770 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
1e780 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
1e790 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
1e7a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1e7b0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
1e7c0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
1e7d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1e7e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1e7f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1e800 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
1e810 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1e820 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
1e830 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e860 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  code */.      co
1e870 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
1e880 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1e890 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1e8a0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
1e8b0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1e8c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
1e8d0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1e8e0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1e8f0 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
1e900 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
1e910 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
1e920 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
1e930 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
1e940 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
1e950 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
1e960 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
1e970 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
1e980 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
1e990 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1e9a0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
1e9b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
1e9c0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
1e9d0 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
1e9e0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
1e9f0 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
1ea00 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
1ea10 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
1ea20 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1ea30 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
1ea40 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
1ea50 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
1ea60 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
1ea70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
1ea80 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
1ea90 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
1eaa0 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
1eab0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
1eac0 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
1ead0 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
1eae0 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
1eaf0 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
1eb00 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
1eb10 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
1eb20 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
1eb30 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
1eb40 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
1eb50 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
1eb60 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
1eb70 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
1eb80 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
1eb90 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
1eba0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
1ebb0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
1ebc0 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
1ebd0 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
1ebe0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
1ebf0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
1ec00 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
1ec10 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
1ec20 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
1ec30 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
1ec40 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
1ec50 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
1ec60 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ec70 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1ec80 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
1ec90 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
1eca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ecb0 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
1ecc0 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
1ecd0 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
1ece0 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
1ecf0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
1ed00 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
1ed10 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
1ed20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1ed30 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
1ed40 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
1ed50 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
1ed60 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
1ed70 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
1ed80 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
1ed90 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
1eda0 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
1edb0 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
1edc0 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
1edd0 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
1ede0 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
1edf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
1ee00 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
1ee10 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
1ee20 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
1ee30 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
1ee40 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
1ee50 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
1ee60 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
1ee70 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
1ee80 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
1ee90 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
1eea0 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
1eeb0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
1eec0 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
1eed0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
1eee0 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
1eef0 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
1ef00 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
1ef10 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
1ef20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
1ef30 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
1ef40 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1ef50 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
1ef60 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
1ef70 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
1ef80 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1ef90 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1efa0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
1efb0 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
1efc0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
1efd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1efe0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
1eff0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
1f000 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
1f010 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1f020 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
1f030 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1f040 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1f050 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
1f060 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
1f070 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1f080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1f090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f0a0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1f0b0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1f0c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1f0d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1f0e0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1f0f0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
1f100 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
1f110 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
1f120 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
1f130 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
1f140 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
1f150 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
1f160 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
1f170 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
1f180 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
1f190 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
1f1a0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
1f1b0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
1f1c0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
1f1d0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
1f1e0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
1f1f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1f200 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1f210 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
1f220 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
1f230 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
1f240 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
1f250 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
1f260 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
1f270 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1f280 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
1f290 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
1f2a0 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
1f2b0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
1f2c0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
1f2d0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
1f2e0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
1f2f0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
1f300 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
1f310 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
1f320 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
1f330 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
1f340 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f350 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1f360 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1f370 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1f380 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1f390 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1f3a0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1f3b0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1f3c0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1f3d0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1f3e0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1f3f0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1f400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f410 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1f420 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1f430 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
1f440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f450 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f470 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
1f480 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  R %p %lld\n", pP
1f490 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
1f4a0 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20  urnalHdr));.    
1f4b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f4c0 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20  OsWrite(.       
1f4d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64       pPager->jfd
1f4e0 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
1f4f0 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67  f(zHeader), pPag
1f500 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20  er->journalHdr. 
1f510 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1f520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f530 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1f550 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1f560 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1f570 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
1f580 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1f590 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1f5a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1f5b0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
1f5c0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
1f5d0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1f5e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f5f0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1f600 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1f610 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
1f620 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
1f630 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
1f640 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
1f650 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
1f660 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
1f670 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f680 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1f690 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1f6a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a   }..    /* The j
1f6b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
1f6c0 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c  just successfull
1f6d0 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61  y synced. Set Pa
1f6e0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  ger.needSync .  
1f6f0 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64    ** to zero and
1f700 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
1f710 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1f720 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20  on all pagess.. 
1f730 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1f740 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1f750 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1f760 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
1f770 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1f780 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
1f790 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
1f7a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
1f7b0 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
1f7c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1f7d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1f7e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f7f0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
1f800 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
1f810 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
1f820 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
1f830 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
1f840 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
1f850 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
1f860 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
1f870 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
1f880 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
1f890 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
1f8a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1f8b0 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
1f8c0 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
1f8d0 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
1f8e0 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
1f8f0 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
1f900 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
1f910 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
1f920 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
1f930 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
1f940 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
1f950 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
1f960 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
1f970 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
1f980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f990 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
1f9a0 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
1f9b0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1f9c0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
1f9d0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
1f9e0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
1f9f0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
1fa00 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
1fa10 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
1fa20 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
1fa30 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
1fa40 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
1fa50 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
1fa60 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
1fa70 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
1fa80 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
1fa90 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
1faa0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
1fab0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1fac0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
1fad0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
1fae0 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
1faf0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
1fb00 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
1fb10 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
1fb20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
1fb30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fb40 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
1fb50 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
1fb60 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
1fb70 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
1fb80 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1fb90 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
1fba0 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
1fbb0 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
1fbc0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1fbd0 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
1fbe0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
1fbf0 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
1fc00 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
1fc10 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
1fc20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
1fc30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fc40 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
1fc50 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
1fc60 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
1fc70 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
1fc80 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
1fc90 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
1fca0 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
1fcb0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1fcc0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
1fcd0 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
1fce0 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
1fcf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1fd00 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
1fd10 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1fd20 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
1fd30 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1fd40 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
1fd50 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
1fd60 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1fd70 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
1fd80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
1fd90 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
1fda0 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
1fdb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1fdc0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1fdd0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1fde0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
1fdf0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1fe20 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
1fe30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1fe60 2f 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  /..  if( NEVER(p
1fe70 4c 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72  List==0) ) retur
1fe80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
1fe90 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
1fea0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
1feb0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
1fec0 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
1fed0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
1fee0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1fef0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1ff00 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
1ff10 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
1ff20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
1ff30 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
1ff40 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
1ff50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
1ff60 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
1ff70 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
1ff80 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
1ff90 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
1ffa0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
1ffb0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
1ffc0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
1ffd0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
1ffe0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
1fff0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
20000 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
20010 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
20020 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
20030 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
20040 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
20050 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
20060 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
20070 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
20080 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
20090 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
200a0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
200b0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
200c0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
200d0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
200e0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
200f0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
20100 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
20110 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
20120 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
20130 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
20140 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
20150 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
20160 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
20170 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
20180 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
20190 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
201a0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
201b0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
201c0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
201d0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
201e0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
201f0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
20200 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
20210 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 4c   !pagerUseWal(pL
20220 69 73 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a  ist->pPager) );.
20230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20240 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
20250 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20  ESERVED );.  rc 
20260 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
20270 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
20280 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20  LUSIVE_LOCK);.. 
20290 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
202a0 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
202b0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
202c0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
202d0 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
202e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
202f0 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
20300 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
20310 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
20320 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
20330 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
20340 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
20350 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
20360 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
20370 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
20380 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
20390 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
203a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
203b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
203c0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
203d0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
203e0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
203f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
20400 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74  e the first writ
20410 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20  e, give the VFS 
20420 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74  a hint of what t
20430 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69  he final.  ** fi
20440 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e  le size will be.
20450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
20460 65 72 2d 3e 64 62 53 69 7a 65 20 3e 20 28 70 50  er->dbSize > (pP
20470 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
20480 2b 31 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50  +1) && isOpen(pP
20490 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
204a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
204b0 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e  zFile = pPager->
204c0 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
204d0 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72  te3_int64)pPager
204e0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71  ->dbSize;.    sq
204f0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
20500 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
20510 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
20520 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
20530 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
20540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20550 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
20560 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
20570 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
20580 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
20590 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
205a0 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
205b0 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
205c0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
205d0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
205e0 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
205f0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
20600 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
20610 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
20620 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
20630 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
20640 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
20650 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
20660 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
20670 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
20680 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
20690 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
206a0 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
206b0 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
206c0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
206d0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
206e0 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
206f0 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
20700 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
20710 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
20720 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
20730 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
20740 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
20750 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
20760 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
20770 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
20780 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
20790 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
207a0 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
207d0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
207e0 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e     ..      /* En
207f0 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
20800 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
20810 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
20820 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
20830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20840 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
20850 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
20860 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
20870 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
20880 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
20890 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
208a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
208b0 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
208c0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
208d0 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
208e0 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
208f0 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
20900 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
20910 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
20920 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
20930 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
20940 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
20950 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
20960 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
20970 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
20980 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
20990 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
209a0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
209b0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
209c0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
209d0 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
209e0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
209f0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
20a00 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
20a10 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
20a20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
20a30 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
20a40 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a   pgno;.      }..
20a50 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
20a60 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
20a70 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
20a80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
20a90 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
20aa0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
20ab0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
20ac0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
20ad0 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
20ae0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
20af0 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
20b00 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
20b10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20b20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
20b30 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
20b40 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
20b50 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
20b60 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
20b70 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
20b80 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
20b90 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
20ba0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
20bb0 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
20bc0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
20bd0 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rite);.    }else
20be0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
20bf0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
20c00 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
20c10 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
20c20 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  o));.    }.#ifde
20c30 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
20c40 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
20c50 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
20c60 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
20c70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
20c80 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
20c90 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
20ca0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
20cb0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
20cc0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
20cd0 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
20ce0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
20cf0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
20d00 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
20d10 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
20d20 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
20d30 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
20d40 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
20d50 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
20d60 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
20d70 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
20d80 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
20d90 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
20da0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
20db0 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
20dc0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
20dd0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
20de0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
20df0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
20e00 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
20e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20e20 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
20e30 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
20e40 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
20e50 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
20e60 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
20e70 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
20e80 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
20e90 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20ea0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
20eb0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
20ec0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
20ed0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
20ee0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20ef0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
20f00 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
20f10 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
20f20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
20f30 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
20f40 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
20f50 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
20f60 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
20f70 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
20f80 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
20f90 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
20fa0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
20fb0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
20fc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
20fd0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
20fe0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
20ff0 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
21000 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
21010 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
21020 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
21030 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
21040 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
21050 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
21060 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
21070 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
21080 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
21090 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
210a0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
210b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
210c0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
210d0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
210e0 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
210f0 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
21100 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
21110 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
21120 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
21130 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
21140 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21150 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
21160 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
21170 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
21180 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
21190 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
211a0 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
211b0 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
211c0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
211d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
211e0 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
211f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21200 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
21210 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
21220 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
21230 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
21240 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
21250 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
21260 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
21270 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
21280 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21290 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
212a0 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
212b0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
212c0 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
212d0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
212e0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
212f0 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
21300 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
21310 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
21320 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
21330 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
21340 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
21350 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
21360 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
21370 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
21380 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
21390 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
213a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
213b0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
213c0 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
213d0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
213e0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28  Pager->nSubRec*(
213f0 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
21400 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ze);.      char 
21410 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20  *pData2;.  .    
21420 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
21430 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
21440 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
21450 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
21460 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  2);.      PAGERT
21470 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
21480 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
21490 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
214a0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
214b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
214c0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
214d0 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
214e0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
214f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21500 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
21510 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
21520 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
21530 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
21540 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
21550 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
21560 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
21570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21580 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
21590 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
215a0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
215b0 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
215c0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
215d0 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
215e0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
215f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21600 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21610 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
21620 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
21630 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
21640 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
21650 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
21660 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
21670 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
21680 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
21690 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
216a0 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
216b0 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
216c0 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
216d0 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
216e0 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
216f0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
21700 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
21710 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
21720 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
21730 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
21740 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
21750 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
21760 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
21770 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
21780 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
21790 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
217a0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
217b0 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
217c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
217d0 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
217e0 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
217f0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
21800 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21810 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
21820 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
21830 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
21840 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
21850 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
21860 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
21870 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
21880 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
21890 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
218a0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
218b0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
218c0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
218d0 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
218e0 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
218f0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
21900 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
21910 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
21920 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
21930 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
21940 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
21950 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
21960 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
21970 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
21980 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
21990 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
219a0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
219b0 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
219c0 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
219d0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
219e0 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
219f0 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
21a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
21a10 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
21a20 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
21a30 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
21a40 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
21a50 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ..  pPg->pDirty 
21a60 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72  = 0;.  if( pager
21a70 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21a80 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  {.    /* Write a
21a90 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f   single frame fo
21aa0 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74  r this page to t
21ab0 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69  he log. */.    i
21ac0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
21ad0 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20  age(pPg) ){ .   
21ae0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
21af0 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20  alPage(pPg); .  
21b00 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
21b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21b20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
21b30 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
21b40 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  Pg, 0, 0, 0);.  
21b50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
21b60 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
21b70 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79  c flag is set by
21b80 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
21b90 72 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  rWrite() functio
21ba0 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 20 20 2a  n while it.    *
21bb0 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  * is journalling
21bc0 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72   a set of two or
21bd0 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20 70   more database p
21be0 61 67 65 73 20 74 68 61 74 20 61 72 65 20 73 74  ages that are st
21bf0 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ored.    ** on t
21c00 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63  he same disk sec
21c10 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65  tor. Syncing the
21c20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
21c30 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20  allowed while.  
21c40 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
21c50 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69 73 20  pening as it is 
21c60 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
21c70 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 73 75  ll members of su
21c80 63 68 20 61 0a 20 20 20 20 2a 2a 20 73 65 74 20  ch a.    ** set 
21c90 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e  of pages are syn
21ca0 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65  ced to disk toge
21cb0 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65  ther. So, if the
21cc0 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74   page this funct
21cd0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 74 72  ion.    ** is tr
21ce0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65  ying to make cle
21cf0 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  an will require 
21d00 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61  a journal sync a
21d10 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  nd the doNotSync
21d20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
21d30 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68  set, return with
21d40 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
21d50 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c  ng. The pcache l
21d60 61 79 65 72 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ayer will.    **
21d70 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f   just have to go
21d80 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63   ahead and alloc
21d90 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62  ate a new page b
21da0 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66  uffer instead of
21db0 0a 20 20 20 20 2a 2a 20 72 65 75 73 69 6e 67 20  .    ** reusing 
21dc0 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  pPg..    **.    
21dd0 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66  ** Similarly, if
21de0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
21df0 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
21e00 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
21e10 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 72  do not.    ** tr
21e20 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
21e30 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67 20 74  ontents of pPg t
21e40 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  o disk..    */. 
21e50 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61     if( NEVER(pPa
21e60 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20 20  ger->errCode).  
21e70 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64     || (pPager->d
21e80 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67 2d  oNotSync && pPg-
21e90 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
21ea0 44 5f 53 59 4e 43 29 0a 20 20 20 20 29 7b 0a 20  D_SYNC).    ){. 
21eb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21ec0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 0a  TE_OK;.    }.  .
21ed0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
21ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
21ef0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
21f00 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
21f10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
21f20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
21f30 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
21f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
21f60 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
21f70 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61  & .        !(pPa
21f80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
21f90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
21fa0 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
21fb0 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33         !(sqlite3
21fc0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
21fd0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
21fe0 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
21ff0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20  _SAFE_APPEND).  
22000 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
22010 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
22020 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
22030 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
22040 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
22050 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
22060 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
22070 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69  r of this page i
22080 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
22090 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
220a0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  f.    ** the dat
220b0 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20  abase image, it 
220c0 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77  may need to be w
220d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
220e0 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  b-journal..    *
220f0 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
22100 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61  e the call to pa
22110 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
22120 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20  st() below will 
22130 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61  not.    ** actua
22140 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
22150 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
22160 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a  is case..    **.
22170 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20      ** Consider 
22180 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
22190 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
221a0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
221b0 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20    BEGIN;.    ** 
221c0 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
221d0 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  e X>.    **     
221e0 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a  <modify page X>.
221f0 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50      **     SAVEP
22200 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20  OINT sp;.    ** 
22210 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
22220 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
22230 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20   pages>.    **  
22240 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73       pagerStress
22250 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20  (page X).    ** 
22260 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
22270 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  sp;.    **.    *
22280 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
22290 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
222a0 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
222b0 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
222c0 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75  ritten.    ** ou
222d0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
222e0 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c  e file, but will
222f0 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
22300 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e   the cache. Then
22310 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ,.    ** followi
22320 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  ng the "ROLLBACK
22330 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e   TO sp" statemen
22340 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  t, reading page 
22350 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20  X will read.    
22360 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
22370 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22380 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
22390 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20   copy of page X 
223a0 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73  as it.    ** was
223b0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
223c0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
223d0 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
223e0 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
223f0 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63  .    ** was exec
22400 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uted..    **.   
22410 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
22420 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68 65   is to write the
22430 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f   current data fo
22440 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68  r page X into th
22450 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f  e .    ** sub-jo
22460 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
22470 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
22480 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
22490 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20  that it will.   
224a0 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20   ** be restored 
224b0 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  to its current v
224c0 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52  alue when the "R
224d0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69  OLLBACK TO sp" i
224e0 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74  s .    ** execut
224f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
22500 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20  f( NEVER(.      
22510 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
22520 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  && pPg->pgno>pPa
22530 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73  ger->dbSize && s
22540 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
22550 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20  pPg).    ) ){.  
22560 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
22570 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
22580 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
22590 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
225a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
225b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
225c0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
225d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
225e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
225f0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
22600 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
22610 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
22620 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
22630 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
22640 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
22650 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
22660 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
22670 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
22680 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
22690 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
226a0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
226b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
226c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
226d0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  r, rc);.}.../*.*
226e0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
226f0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
22700 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
22710 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
22720 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
22730 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
22740 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
22750 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
22760 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
22770 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
22780 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
22790 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
227a0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
227b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
227c0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
227d0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
227e0 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
227f0 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
22800 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
22810 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
22820 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
22830 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
22840 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
22850 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
22860 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
22870 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
22880 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
22890 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
228a0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
228b0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
228c0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
228d0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
228e0 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
228f0 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
22900 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
22910 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
22920 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
22930 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
22940 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
22950 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
22960 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
22970 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
22980 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
22990 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
229a0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
229b0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
229c0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
229d0 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
229e0 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
229f0 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
22a00 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
22a10 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
22a20 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
22a30 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
22a40 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
22a50 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
22a60 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
22a70 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
22a80 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
22a90 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a  DLOCK flags..**.
22aa0 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
22ab0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
22ac0 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
22ad0 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
22ae0 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
22af0 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
22b00 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
22b10 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
22b20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
22b30 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
22b40 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
22b50 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
22b60 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
22b70 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
22b80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
22b90 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
22ba0 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
22bb0 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
22bc0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
22bd0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
22be0 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
22bf0 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
22c00 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
22c10 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
22c20 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
22c30 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
22c40 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
22c50 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
22c60 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
22c70 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
22c80 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
22c90 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
22ca0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22cb0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
22cc0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
22cd0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
22ce0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
22cf0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
22d00 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
22d10 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
22d20 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
22d30 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
22d40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
22d50 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
22d60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22d70 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
22d80 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
22da0 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
22db0 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
22dc0 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
22dd0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
22de0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
22df0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
22e00 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
22e10 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
22e20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
22e30 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
22e40 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
22e50 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
22e60 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
22e70 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
22e80 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
22e90 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
22ea0 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
22eb0 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
22ec0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
22ed0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
22ee0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
22ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
22f00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22f10 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
22f20 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
22f30 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
22f40 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
22f50 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
22f60 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
22f70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
22f80 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
22f90 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
22fa0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61  ile */.  int rea
22fb0 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20  dOnly = 0;      
22fc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
22fd0 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s is a read-only
22fe0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a   file */.  int j
22ff0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20  ournalFileSize; 
23000 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
23010 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63  allocate for eac
23020 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a  h journal fd */.
23030 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d    char *zPathnam
23040 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75  e = 0;     /* Fu
23050 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  ll path to datab
23060 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
23070 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
23080 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23090 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61   of bytes in zPa
230a0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  thname */.  int 
230b0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
230c0 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
230d0 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a  _JOURNAL)==0; /*
230e0 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a   False to omit j
230f0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
23100 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
23110 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
23120 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a  EADLOCK)!=0;  /*
23130 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65   True to omit re
23140 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  ad-lock */.  int
23150 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
23160 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
23170 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
23180 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
23190 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31  r PCache */.  u1
231a0 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  6 szPageDflt = S
231b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
231c0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
231d0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
231e0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
231f0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
23200 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
23210 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
23220 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
23230 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
23240 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
23250 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
23260 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
23270 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
23280 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
23290 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
232a0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
232b0 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
232c0 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
232d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
232e0 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
232f0 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
23300 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
23310 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
23320 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
23330 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
23340 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
23350 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
23360 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
23370 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
23380 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
23390 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
233a0 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
233b0 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
233c0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
233d0 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
233e0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
233f0 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
23400 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
23410 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
23420 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
23430 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
23440 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
23450 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
23460 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
23470 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
23480 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
23490 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
234a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
234b0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
234c0 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
234d0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
234e0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
234f0 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
23500 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
23510 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
23520 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
23530 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
23540 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
23550 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
23560 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
23570 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
23580 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
23590 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
235a0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
235b0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
235c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
235d0 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
235e0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
235f0 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20  (nPathname*2);. 
23600 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
23610 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
23620 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
23630 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
23640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
23650 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
23660 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
23670 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
23680 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
23690 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
236a0 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [0] = 0;.    }el
236b0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
236c0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
236d0 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20  0] = 0; /* Make 
236e0 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  sure initialized
236f0 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74   even if FullPat
23700 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f  hname() fails */
23710 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23720 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
23730 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
23740 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
23750 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
23760 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
23770 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
23780 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
23790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
237a0 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b  OK && nPathname+
237b0 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  8>pVfs->mxPathna
237c0 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  me ){.      /* T
237d0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
237e0 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  ken when the jou
237f0 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72  rnal path requir
23800 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74  ed by.      ** t
23810 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
23820 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65  g opened will be
23830 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d   more than pVfs-
23840 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20  >mxPathname.    
23850 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65    ** bytes in le
23860 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73  ngth. This means
23870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
23880 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a  nnot be opened,.
23890 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77        ** as it w
238a0 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  ill not be possi
238b0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
238c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
238d0 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68  even.      ** ch
238e0 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  eck for a hot-jo
238f0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61  urnal before rea
23900 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ding..      */. 
23910 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23920 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
23930 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23960 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
23970 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23980 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
23990 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
239a0 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
239b0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
239c0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
239d0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
239e0 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
239f0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
23a00 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
23a10 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
23a20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
23a30 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
23a40 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
23a50 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a70 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
23a80 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23a90 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ab0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
23ac0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
23ad0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
23ae0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
23af0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
23b00 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
23b10 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
23b20 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
23b30 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
23b40 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
23b50 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
23b60 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
23b70 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
23b80 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
23b90 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
23ba0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
23bb0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
23bc0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
23bd0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
23be0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
23bf0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
23c00 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
23c10 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
23c20 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
23c30 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a  (.    ROUND8(siz
23c40 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20  eof(*pPager)) + 
23c50 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
23c60 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52  ructure */.    R
23c70 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
23c80 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ) +           /*
23c90 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
23ca0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66  /.    ROUND8(pVf
23cb0 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20  s->szOsFile) +  
23cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
23cd0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
23ce0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
23cf0 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f  * 2 +          /
23d00 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
23d10 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
23d20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d40 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20  * zFilename */. 
23d50 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38     nPathname + 8
23d60 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
23d70 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f    /* zJournal */
23d80 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
23d90 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
23da0 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
23db0 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
23dc0 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
23dd0 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
23de0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
23df0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
23e00 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
23e10 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
23e30 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
23e40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
23e50 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
23e60 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
23e70 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
23e80 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
23e90 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
23ea0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
23eb0 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
23ec0 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
23ed0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
23ee0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
23ef0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
23f00 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
23f10 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
23f20 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
23f30 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
23f40 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
23f50 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
23f60 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
23f70 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
23f80 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
23f90 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
23fa0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
23fb0 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
23fc0 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
23fd0 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
23fe0 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
23ff0 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
24000 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  me ){.    pPager
24010 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
24020 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
24030 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20  Pathname + 1);. 
24040 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
24050 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  ->zFilename, zPa
24060 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
24070 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  e);.    memcpy(p
24080 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
24090 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
240a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
240b0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
240c0 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
240d0 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b   "-journal", 8);
240e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
240f0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30  >zFilename[0]==0
24100 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72   ) pPager->zJour
24110 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  nal[0] = 0;.    
24120 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
24130 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
24140 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
24150 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
24160 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
24170 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
24180 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
24190 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
241a0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
241b0 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
241c0 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
241d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241e0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
241f0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
24200 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
24210 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
24220 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
24230 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
24240 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
24250 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f  fout);.    readO
24260 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
24270 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
24280 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
24290 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
242a0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
242b0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
242c0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
242d0 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
242e0 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
242f0 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
24300 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
24310 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
24320 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
24330 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
24340 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
24350 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
24360 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24370 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
24380 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
24390 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
243a0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
243b0 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
243c0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
243d0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
243e0 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
243f0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
24400 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61  QLITE_OK && !rea
24410 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73  dOnly ){.      s
24420 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
24430 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
24440 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
24450 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
24460 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
24470 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
24480 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
24490 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
244a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
244b0 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
244c0 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
244d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
244e0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
244f0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
24500 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
24510 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
24520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24530 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
24540 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65   (u16)pPager->se
24550 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
24560 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64    }.      }.#ifd
24570 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
24580 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
24590 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e      {.        in
245a0 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
245b0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
245c0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
245d0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  d);.        int 
245e0 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ii;.        asse
245f0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
24600 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
24610 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
24620 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
24630 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
24640 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
24650 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
24660 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
24670 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
24680 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
24690 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
246a0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
246b0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
246c0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
246d0 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
246e0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
246f0 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
24700 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
24710 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
24720 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
24730 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
24740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24750 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   If a temporary 
24760 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65  file is requeste
24770 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  d, it is not ope
24780 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ned immediately.
24790 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
247a0 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74  case we accept t
247b0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
247c0 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61  size and delay a
247d0 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f  ctually.    ** o
247e0 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20  pening the file 
247f0 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
24800 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28  call to OsWrite(
24810 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
24820 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
24830 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20  also run for an 
24840 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24850 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79  se. An in-memory
24860 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
24870 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
24880 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74  a temp-file that
24890 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
248a0 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20  n out to.    ** 
248b0 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e  disk and uses an
248c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62   in-memory rollb
248d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ack journal..   
248e0 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
248f0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
24900 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
24910 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
24920 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
24930 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
24940 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
24950 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
24960 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
24970 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
24980 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
24990 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
249a0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
249b0 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
249c0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
249d0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
249e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
249f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
24a00 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
24a10 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
24a20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
24a30 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
24a40 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
24a50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
24a60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
24a70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
24a80 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
24a90 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
24aa0 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
24ab0 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ree the .  ** Pa
24ac0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
24ad0 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  d close the file
24ae0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  ..  */.  if( rc!
24af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24b00 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
24b10 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a  r->pTmpSpace );.
24b20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
24b30 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
24b40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24b50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
24b60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
24b70 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
24b80 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
24b90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45   */.  assert( nE
24ba0 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e  xtra<1000 );.  n
24bb0 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e  Extra = ROUND8(n
24bc0 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65  Extra);.  sqlite
24bd0 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
24be0 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
24bf0 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
24c00 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
24c10 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
24c20 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
24c30 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
24c40 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  e);..  PAGERTRAC
24c50 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
24c60 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
24c70 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
24c80 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
24c90 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
24ca0 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
24cb0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
24cc0 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
24cd0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
24ce0 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
24cf0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
24d00 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c  dlock = (noReadl
24d10 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29  ock && readOnly)
24d20 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67   ?1:0;.  /* pPag
24d30 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
24d40 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
24d50 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
24d60 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
24d70 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
24d80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
24d90 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  lid = (u8)memDb;
24da0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
24db0 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  mtSize = 0; */. 
24dc0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
24dd0 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  JSize = 0; */.  
24de0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  /* pPager->nPage
24df0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24e00 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
24e10 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
24e20 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
24e30 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
24e40 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
24e50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
24e60 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
24e70 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
24e80 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
24e90 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
24ea0 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
24eb0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
24ec0 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
24ed0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
24ee0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
24ef0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
24f00 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
24f10 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
24f20 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
24f30 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
24f40 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
24f50 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
24f60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
24f70 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
24f80 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
24f90 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
24fa0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
24fb0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
24fc0 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
24fd0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
24fe0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
24ff0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
25000 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
25010 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  = 0; */.  assert
25020 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
25030 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
25040 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
25050 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
25060 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
25070 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
25080 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
25090 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
250a0 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  c_flags = SQLITE
250b0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
250c0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
250d0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
250e0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
250f0 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
25100 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
25110 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
25120 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
25130 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
25140 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
25150 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
25160 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
25170 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
25180 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
25190 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
251a0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
251b0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
251c0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
251d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
251e0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
251f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
25200 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
25210 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
25220 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
25230 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
25240 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
25250 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
25260 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
25270 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
25280 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
25290 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
252a0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
252b0 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
252c0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
252d0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
252e0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20  ->aHash)); */.. 
252f0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
25300 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
25310 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
25320 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25330 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
25340 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
25350 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
25360 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
25370 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
25380 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
25390 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
253a0 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
253b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
253c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
253d0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
253e0 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
253f0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
25400 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
25410 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
25420 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
25430 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
25440 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
25450 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
25460 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
25470 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
25480 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
25490 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
254a0 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
254b0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
254c0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
254d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
254e0 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
254f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
25500 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
25510 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
25520 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
25530 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
25540 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
25550 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
25560 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
25570 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25580 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
25590 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
255a0 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
255b0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
255c0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
255d0 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
255e0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
255f0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
25600 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
25610 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
25620 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
25630 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
25640 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
25650 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
25660 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
25670 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
25680 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
25690 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
256a0 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
256b0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
256c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
256d0 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
256e0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
256f0 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
25700 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
25710 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
25720 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
25730 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
25740 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
25750 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
25760 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
25770 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
25780 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
25790 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
257a0 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
257b0 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
257c0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
257d0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
257e0 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
257f0 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
25800 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
25810 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
25820 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
25830 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
25840 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
25850 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
25860 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
25870 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
25880 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
25890 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
258a0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
258b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
258c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
258d0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
258e0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
258f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
25900 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
25910 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
25920 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
25930 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
25940 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
25950 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
25960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25970 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
25980 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25990 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
259a0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
259b0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
259c0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
259d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
259e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
259f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
25a00 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
25a10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25a20 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
25a30 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
25a40 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
25a50 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
25a60 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
25a70 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
25a80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25a90 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
25aa0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
25ab0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
25ac0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25ad0 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45  r->state <= PAGE
25ae0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
25af0 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
25b00 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
25b10 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
25b20 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
25b30 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
25b40 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
25b50 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
25b60 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
25b70 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
25b80 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
25b90 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
25ba0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
25bb0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
25bc0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
25bd0 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
25be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25bf0 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
25c00 69 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20  int locked;     
25c10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25c20 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
25c30 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
25c40 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
25c50 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
25c60 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
25c70 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
25c80 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
25c90 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
25ca0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
25cb0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
25cc0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
25cd0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
25ce0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
25cf0 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
25d00 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
25d10 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
25d20 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
25d30 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
25d40 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
25d50 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
25d60 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
25d70 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
25d80 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
25d90 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
25da0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
25db0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
25dc0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
25dd0 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
25de0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
25df0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
25e00 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
25e10 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
25e20 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
25e30 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
25e40 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
25e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
25e60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
25e70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
25e80 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
25e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25ea0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
25eb0 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20   int nPage;..   
25ec0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20     /* Check the 
25ed0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
25ee0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
25ef0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70   consists of 0 p
25f00 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74  ages,.      ** t
25f10 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
25f20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65  ournal file. See
25f30 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
25f40 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20  ent above for . 
25f50 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73       ** the reas
25f60 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c  oning here.  Del
25f70 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65  ete the obsolete
25f80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e   journal file un
25f90 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52  der.      ** a R
25fa0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
25fb0 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69  avoid race condi
25fc0 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f  tions and to avo
25fd0 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20  id violating.   
25fe0 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a     ** [H33020]..
25ff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
26000 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26010 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
26020 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
26030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
26050 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
26060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
26070 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
26080 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
26090 28 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  ( sqlite3OsLock(
260a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
260b0 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
260c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
260d0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
260e0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
260f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
26100 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26110 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
26120 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
26130 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
26140 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
26150 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
26160 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
26170 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26180 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
26190 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
261a0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
261b0 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
261c0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
261d0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
261e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
261f0 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
26200 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
26210 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
26220 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
26230 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
26240 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
26250 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
26260 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
26270 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
26280 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
26290 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
262a0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
262b0 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
262c0 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
262d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
262e0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
262f0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
26300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
26310 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
26320 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
26330 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26340 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
26350 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
26360 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
26370 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
26380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26390 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
263a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
263b0 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
263c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
263d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
263e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
263f0 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
26400 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
26410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
26420 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
26430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26450 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
26460 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
26470 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
26480 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26490 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
264a0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
264b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
264c0 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
264d0 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
264e0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
264f0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
26500 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
26510 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
26520 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
26530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
26540 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
26550 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
26560 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65  ts has a zero he
26570 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74  ader, that might
26580 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f   be due to an I/
26590 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20  O error, or.    
265a0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69          ** it mi
265b0 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68  ght be due to th
265c0 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  e race condition
265d0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
265e0 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20   and in.        
265f0 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33      ** ticket #3
26600 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79  883.  Either way
26610 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
26620 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
26630 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
26640 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61   This might be a
26650 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e   false positive.
26660 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20    But if it is, 
26670 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
26680 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69       ** automati
26690 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  c journal playba
266a0 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20  ck and recovery 
266b0 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64  mechanism will d
266c0 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eal.            
266d0 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72  ** with it under
266e0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
266f0 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  ck where we do n
26700 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20  ot need to.     
26710 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20         ** worry 
26720 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63  so much with rac
26730 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20  e conditions..  
26740 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
26750 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74           *pExist
26760 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  s = 1;.         
26770 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26780 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
26790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
267a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
267b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
267c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
267d0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
267e0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
267f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26800 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
26810 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
26820 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
26830 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
26840 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
26850 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
26860 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
26870 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
26880 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
26890 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
268a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
268b0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
268c0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
268d0 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
268e0 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
268f0 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
26900 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
26910 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
26920 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
26930 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
26940 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
26950 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
26960 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
26970 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
26980 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
26990 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
269a0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
269b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
269c0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
269d0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
269e0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
269f0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
26a00 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
26a10 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
26a20 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
26a30 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
26a40 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
26a50 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
26a60 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
26a70 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
26a80 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
26a90 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
26aa0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
26ab0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
26ac0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
26ad0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26ae0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
26af0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
26b00 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
26b10 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
26b20 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
26b30 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
26b40 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
26b50 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
26b60 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
26b70 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
26b80 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
26b90 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
26ba0 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
26bb0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
26bc0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
26bd0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
26be0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
26bf0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
26c00 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
26c10 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
26c20 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
26c30 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
26c40 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
26c50 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
26c60 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65  the operation de
26c70 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61  scribed by (2) a
26c80 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65  bove is not atte
26c90 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68  mpted, and if th
26ca0 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e  e.** pager is in
26cb0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
26cc0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
26cd0 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73  E_FULL when this
26ce0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74   is called,.** t
26cf0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
26d00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26d10 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72  urned. It is per
26d20 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74  mitted to read t
26d30 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  he.** database w
26d40 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55  hen in SQLITE_FU
26d50 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  LL error state..
26d60 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
26d70 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
26d80 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
26d90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
26da0 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f  ned. If an.** IO
26db0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
26dc0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
26dd0 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
26de0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
26df0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  rnal.** file or 
26e00 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
26e10 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
26e20 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
26e30 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
26e40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
26e50 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
26e60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26e70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26e90 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26ea0 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65  .  int isErrorRe
26eb0 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
26ec0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
26ed0 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d   recovering from
26ee0 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
26ef0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
26f00 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
26f10 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
26f20 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
26f30 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
26f40 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
26f50 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
26f60 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
26f70 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
26f80 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  he)==0 );.  if( 
26f90 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70  NEVER(MEMDB && p
26fa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
26fb0 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  ){ return pPager
26fc0 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20  ->errCode; }..  
26fd0 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
26fe0 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ase is in an err
26ff0 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73  or-state, now is
27000 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65   a chance to cle
27010 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
27020 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
27030 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
27040 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72  ager-cache and r
27050 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79  ollback.  ** any
27060 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   hot journal in 
27070 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
27080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
27090 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
270a0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
270b0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
270c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29  ager->zJournal )
270d0 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
270e0 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
270f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
27100 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
27110 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
27120 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
27130 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
27140 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
27150 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52  rc = pagerBeginR
27160 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
27170 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  Pager);.  }else 
27180 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
27190 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
271a0 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
271b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
271c0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
271d0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
271e0 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
271f0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73  rnal = 0;.    as
27200 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
27210 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
27220 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
27230 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
27240 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
27250 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
27260 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ock ){.      ass
27270 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61  ert( pPager->rea
27280 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70  dOnly );.      p
27290 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
272a0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
272b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
272c0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
272d0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
272e0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
272f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
27310 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27320 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
27330 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
27340 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
27350 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
27360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27370 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27380 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
27390 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
273a0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
273b0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
273c0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
273d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
273e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
273f0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
27400 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
27410 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
27420 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
27430 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
27440 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  et ){.      asse
27450 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27460 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
27470 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  D );.      rc = 
27480 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
27490 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
274a0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
274b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
274c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
274d0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
274e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
274f0 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
27500 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
27510 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
27520 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
27530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27540 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
27550 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
27560 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
27570 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
27580 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
27590 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
275a0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
275b0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
275c0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
275d0 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
275e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
275f0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
27600 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
27610 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
27620 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
27630 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
27640 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
27650 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
27660 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
27670 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
27680 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
27690 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
276a0 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
276b0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
276c0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
276d0 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
276e0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
276f0 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
27700 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
27710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
27720 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
27730 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
27740 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
27750 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
27760 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
27770 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
27780 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
27790 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
277a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
277b0 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
277c0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
277d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
277e0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
277f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
27800 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
27810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27820 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
27830 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
27840 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
27850 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
27860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
27870 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
27880 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
27890 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
278a0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
278b0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
278c0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
278d0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
278e0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
278f0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
27900 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
27910 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
27920 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
27930 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
27940 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
27950 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
27960 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
27970 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
27980 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
27990 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
279a0 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
279b0 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
279c0 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
279d0 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
279e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
279f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27a00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
27a10 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
27a20 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
27a30 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
27a40 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
27a50 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
27a60 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
27a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27a80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
27a90 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
27aa0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
27ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
27ac0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
27ad0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
27ae0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
27af0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
27b00 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27b10 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
27b20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
27b30 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
27b40 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
27b50 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
27b60 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
27b70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
27b90 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
27ba0 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
27bb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27bc0 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
27bd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
27be0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
27bf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27c00 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
27c20 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27c30 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
27c40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27c60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
27c70 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
27c80 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
27c90 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
27ca0 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  me .            
27cb0 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
27cc0 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
27cd0 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
27ce0 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
27cf0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
27d00 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62  is connection ob
27d10 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75  tained the exclu
27d20 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e  sive lock above.
27d30 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20   Or, it .       
27d40 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e       ** may mean
27d50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
27d60 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72  was in the error
27d70 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
27d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27d90 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
27da0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
27db0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
27dc0 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20  t exist.  */.   
27dd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
27de0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
27df0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
27e00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27e10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27e20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27e30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27e40 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
27e50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
27e60 52 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  Reset the journa
27e70 6c 20 73 74 61 74 75 73 20 66 69 65 6c 64 73 20  l status fields 
27e80 74 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  to indicates tha
27e90 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20  t we have no.   
27ea0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a     ** rollback j
27eb0 6f 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74  ournal at this t
27ec0 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  ime. */.      pP
27ed0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
27ee0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
27ef0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27f00 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
27f10 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
27f20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
27f30 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
27f40 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61  0;. .      /* Ma
27f50 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
27f60 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
27f70 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
27f80 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20  . */. .      /* 
27f90 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
27fa0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
27fb0 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
27fc0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
27fd0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
27fe0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
27ff0 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
28000 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
28010 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
28020 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
28030 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
28040 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
28050 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
28060 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
28070 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
28080 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
28090 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
280a0 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
280b0 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
280c0 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
280d0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
280e0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
280f0 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
28100 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
28110 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
28120 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
28130 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
28140 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
28150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
28160 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28170 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
28180 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
28190 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
281a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
281b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
281c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
281d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
281e0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
281f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28210 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28220 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
28230 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
28240 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
28250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28260 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
28270 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
28280 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
28290 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
282a0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
282b0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
282c0 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
282d0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
282e0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ..    if( pPager
282f0 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c  ->pBackup || sql
28300 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
28310 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
28320 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  che)>0 ){.      
28330 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
28340 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
28350 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
28360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
28370 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
28380 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
28390 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
283a0 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
283b0 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
283c0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
283d0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
283e0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
283f0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
28400 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
28410 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
28420 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
28430 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
28440 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
28450 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
28460 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
28470 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
28480 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
28490 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
284a0 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
284b0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
284c0 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
284d0 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
284e0 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
284f0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
28500 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
28510 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
28520 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
28530 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
28540 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
28550 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
28560 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
28570 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
28580 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
28590 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
285a0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
285b0 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
285c0 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
285d0 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
285e0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
285f0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
28600 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
28610 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
28620 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
28630 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
28640 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  */.      int nPa
28650 67 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64  ge;.      char d
28660 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
28670 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
28680 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ers)];.      sql
28690 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
286a0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
286b0 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  e);..      if( p
286c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
286d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
286e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
286f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
28700 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
28710 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20      if( nPage>0 
28720 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
28730 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
28740 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
28750 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
28760 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
28770 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
28780 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
28790 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
287a0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
287b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
287c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
287d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
287e0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
287f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28800 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
28810 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
28820 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
28830 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
28840 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
28850 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
28860 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
28870 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
28880 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
28890 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
288a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
288b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
288c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
288d0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
288e0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
288f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
28900 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65  re is a WAL file
28910 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
28920 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64  tem, open this d
28930 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20  atabase in WAL. 
28940 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65     ** mode. Othe
28950 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f  rwise, the follo
28960 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  wing function ca
28970 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
28980 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
28990 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
289a0 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  sent(pPager);.  
289b0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
289c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
289d0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
289e0 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
289f0 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
28a00 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
28a10 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
28a20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
28a30 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
28a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28a50 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  ./*.** If the re
28a60 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61  ference count ha
28a70 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20  s reached zero, 
28a80 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  rollback any act
28a90 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
28aa0 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  on and unlock th
28ab0 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45  e pager..**.** E
28ac0 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e  xcept, in lockin
28ad0 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45  g_mode=EXCLUSIVE
28ae0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   when there is n
28af0 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20  othing to in.** 
28b00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
28b10 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b  rnal, the unlock
28b20 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65   is not performe
28b30 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a  d and there is.*
28b40 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c  * nothing to rol
28b50 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72  lback, so this r
28b60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
28b70 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  p..*/ .static vo
28b80 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
28b90 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
28ba0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71  ager){.  if( (sq
28bb0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
28bc0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
28bd0 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28  che)==0).   && (
28be0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
28bf0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
28c00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
28c10 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  .  ){.    pagerU
28c20 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
28c30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
28c40 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
28c50 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
28c60 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
28c70 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
28c80 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
28c90 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
28ca0 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
28cb0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
28cc0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
28cd0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
28ce0 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
28cf0 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
28d00 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
28d10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
28d20 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
28d30 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
28d40 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
28d50 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
28d60 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
28d70 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
28d80 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
28d90 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
28da0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
28db0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
28dc0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
28dd0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
28de0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
28df0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
28e00 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
28e10 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
28e20 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
28e30 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
28e40 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
28e50 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
28e60 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
28e70 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
28e80 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
28e90 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
28ea0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
28eb0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
28ec0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
28ed0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
28ee0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
28ef0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
28f00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28f10 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
28f20 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
28f30 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
28f40 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
28f50 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
28f60 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
28f70 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
28f80 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
28f90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
28fa0 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
28fb0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
28fc0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
28fd0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
28fe0 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
28ff0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
29000 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
29010 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
29020 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
29030 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
29040 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
29050 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
29060 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
29070 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
29080 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
29090 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
290a0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
290b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
290c0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
290d0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
290e0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
290f0 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
29100 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
29110 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
29120 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
29130 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
29140 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
29150 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
29160 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
29170 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
29180 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
29190 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
291a0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
291b0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
291c0 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
291d0 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
291e0 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
291f0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
29200 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
29210 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
29220 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
29230 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
29240 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
29250 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
29260 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
29270 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
29280 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
29290 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
292a0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
292b0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
292c0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
292d0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
292e0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
292f0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
29300 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
29310 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
29320 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
29330 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
29340 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
29350 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
29360 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
29370 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
29380 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
29390 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
293a0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
293b0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
293c0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
293d0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
293e0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
293f0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
29400 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
29410 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
29420 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
29430 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
29440 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
29450 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
29460 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
29470 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
29480 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
29490 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
294a0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
294b0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
294c0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
294d0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
294e0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
294f0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
29500 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
29510 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
29520 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
29530 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
29540 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
29550 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
29560 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
29570 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
29580 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
29590 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
295a0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
295b0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
295c0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
295d0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
295e0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
295f0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
29600 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
29610 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
29620 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
29630 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
29640 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
29650 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
29660 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
29670 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
29680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
29690 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
296a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
296b0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
296c0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
296d0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
296e0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
296f0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
29700 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
29710 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
29720 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
29730 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
29740 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
29750 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
29760 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
29770 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
29780 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
29790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
297a0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e  ->state>PAGER_UN
297b0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  LOCK );..  if( p
297c0 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
297d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
297e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
297f0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
29800 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
29810 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61   state, return a
29820 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74  n error immediat
29830 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ely. .  ** Other
29840 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68  wise, request th
29850 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
29860 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f  PCache layer. */
29870 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
29880 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
29890 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  K && pPager->err
298a0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
298b0 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  L ){.    rc = pP
298c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
298d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
298e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
298f0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
29900 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70  che, pgno, 1, pp
29910 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
29920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29930 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
29940 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
29950 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
29960 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
29970 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
29980 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
29990 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
299a0 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
299b0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
299c0 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
299d0 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
299e0 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
299f0 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
29a00 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
29a10 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
29a20 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
29a30 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
29a40 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
29a50 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
29a60 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50  age)->pPager==pP
29a70 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65  ager || (*ppPage
29a80 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  )->pPager==0 );.
29a90 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29  .  if( (*ppPage)
29aa0 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43  ->pPager && !noC
29ab0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  ontent ){.    /*
29ac0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
29ad0 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79  e pcache already
29ae0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69   contains an ini
29af0 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66  tialized copy of
29b00 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
29b10 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
29b20 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a   further ado.  *
29b30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
29b40 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47  no<=PAGER_MAX_PG
29b50 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45  NO && pgno!=PAGE
29b60 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
29b70 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  ) );.    PAGER_I
29b80 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
29b90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
29ba0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73  LITE_OK;..  }els
29bb0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e{.    /* The pa
29bc0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
29bd0 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
29be0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
29bf0 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
29c00 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20  e initialized.  
29c10 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
29c20 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ..    PAGER_INCR
29c30 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
29c40 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61  .    pPg = *ppPa
29c50 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ge;.    pPg->pPa
29c60 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20  ger = pPager;.. 
29c70 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
29c80 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
29c90 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
29ca0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
29cb0 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75  a page.    ** nu
29cc0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
29cd0 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75  n this, or the u
29ce0 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61  nused locking-pa
29cf0 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ge, is requested
29d00 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
29d10 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
29d20 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
29d30 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
29d40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
29d50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29d60 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
29d70 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
29d80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
29d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
29da0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
29db0 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
29dc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29dd0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
29de0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
29df0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
29e00 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29  DB || nMax<(int)
29e10 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
29e20 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  t || !isOpen(pPa
29e30 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
29e40 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
29e50 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
29e60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29e70 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67  _FULL;.        g
29e80 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
29e90 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
29ea0 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
29eb0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
29ec0 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
29ed0 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
29ee0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
29ef0 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
29f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
29f10 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
29f20 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
29f30 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
29f40 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
29f50 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
29f60 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
29f70 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
29f80 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
29f90 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
29fa0 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
29fb0 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
29fc0 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
29fd0 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
29fe0 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
29ff0 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
2a000 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
2a010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a020 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2a030 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
2a040 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
2a050 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
2a060 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
2a070 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
2a080 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
2a090 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
2a0a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
2a0b0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
2a0c0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
2a0d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
2a0e0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
2a0f0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2a100 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
2a110 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
2a120 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
2a130 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2a140 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
2a150 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2a160 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
2a170 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
2a180 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2a190 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
2a1a0 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
2a1b0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
2a1c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a1d0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2a1e0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2a1f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
2a200 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
2a210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a230 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
2a240 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
2a250 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
2a260 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
2a270 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
2a280 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
2a290 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
2a2a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2a2b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
2a2c0 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
2a2d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2a2e0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
2a2f0 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
2a300 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
2a310 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
2a320 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
2a330 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
2a340 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
2a350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
2a360 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
2a370 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2a380 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
2a390 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
2a3a0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
2a3b0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
2a3c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2a3d0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
2a3e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2a3f0 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c   in cache. Also,
2a400 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
2a410 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e   .** pager is in
2a420 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
2a430 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
2a440 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2a450 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70  ,.** or if the p
2a460 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
2a470 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2a480 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2a490 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2a4a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2a4b0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
2a4c0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2a4d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
2a4e0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2a4f0 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
2a500 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
2a510 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
2a520 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
2a530 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2a540 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
2a550 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
2a560 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
2a570 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
2a580 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
2a590 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
2a5a0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
2a5b0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
2a5c0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
2a5d0 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
2a5e0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
2a5f0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
2a600 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
2a610 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
2a620 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
2a630 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a640 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
2a650 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a660 72 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52  r->state > PAGER
2a670 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c  _UNLOCK );.  sql
2a680 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2a690 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
2a6a0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
2a6b0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
2a6c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
2a6d0 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
2a6e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
2a6f0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
2a700 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2a710 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
2a720 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
2a730 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
2a740 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
2a750 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
2a760 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
2a770 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
2a780 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
2a790 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
2a7a0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
2a7b0 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
2a7c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
2a7d0 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
2a7e0 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
2a7f0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
2a800 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a810 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2a820 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
2a830 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
2a840 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
2a850 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2a860 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2a870 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
2a880 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
2a890 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
2a8a0 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
2a8b0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
2a8c0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
2a8d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2a8e0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
2a8f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2a900 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
2a910 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
2a920 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
2a930 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
2a940 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
2a950 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
2a960 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
2a970 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
2a980 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
2a990 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
2a9a0 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
2a9b0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
2a9c0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
2a9d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
2a9e0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
2a9f0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
2aa00 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
2aa10 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
2aa20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
2aa30 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
2aa40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
2aa50 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
2aa60 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
2aa70 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
2aa80 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
2aa90 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
2aaa0 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
2aab0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2aac0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
2aad0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
2aae0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2aaf0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
2ab00 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
2ab10 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2ab20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2ab30 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
2ab40 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
2ab50 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2ab60 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
2ab70 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
2ab80 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2ab90 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
2aba0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2abb0 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
2abc0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
2abd0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
2abe0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
2abf0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
2ac00 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
2ac10 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
2ac20 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
2ac30 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
2ac40 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
2ac50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2ac60 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
2ac70 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2ac80 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2ac90 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2acb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2acc0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2acf0 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2ad00 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  e file */.  sqli
2ad10 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2ad20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2ad30 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
2ad40 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
2ad50 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
2ad60 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2ad70 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
2ad80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ad90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2ada0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2adb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2adc0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2add0 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73  MODE_OFF );.  as
2ade0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
2adf0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
2ae00 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
2ae10 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
2ae20 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
2ae30 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
2ae40 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
2ae50 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
2ae60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
2ae70 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
2ae80 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
2ae90 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
2aea0 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
2aeb0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
2aec0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
2aed0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
2aee0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2aef0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
2af00 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2af10 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2af20 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2af30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
2af40 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
2af50 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
2af60 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
2af70 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66  ate(nPage);.  if
2af80 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2af90 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
2afa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2afb0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  EM;.  }..  /* Op
2afc0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2afd0 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
2afe0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
2aff0 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
2b000 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2b010 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2b020 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2b030 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2b040 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73  EMORY ){.      s
2b050 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2b060 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2b070 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b080 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
2b090 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20  ags =           
2b0a0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2b0b0 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75  lags to open jou
2b0c0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
2b0d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
2b0e0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
2b0f0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
2b100 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
2b110 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20  tempFile ? .    
2b120 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
2b130 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2b140 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
2b150 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
2b160 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
2b170 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2b180 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64  .        );.#ifd
2b190 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2b1a0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2b1b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b1c0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
2b1d0 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
2b1e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
2b1f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
2b200 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  s, jrnlBufferSiz
2b210 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20  e(pPager).      
2b220 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  );.#else.      r
2b230 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2b240 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2b250 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2b260 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
2b270 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
2b280 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
2b290 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
2b2a0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2b2b0 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72  );.  }...  /* Wr
2b2c0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
2b2d0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
2b2e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b2f0 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20   and open .  ** 
2b300 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2b310 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
2b320 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2b330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
2b340 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
2b350 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
2b360 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
2b370 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
2b380 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
2b390 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
2b3a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2b3b0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
2b3c0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
2b3d0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
2b3e0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
2b3f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2b400 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  lOff = 0;.    pP
2b410 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
2b420 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2b430 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
2b440 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a  .    rc = writeJ
2b450 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
2b460 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
2b470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b480 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
2b490 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
2b4a0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
2b4b0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2b4c0 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nal = 0;.  }.  r
2b4d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b4e0 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
2b4f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
2b500 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2b510 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2b520 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
2b530 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
2b540 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
2b550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2b560 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2b570 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
2b580 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
2b590 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
2b5a0 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
2b5b0 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
2b5c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2b5d0 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
2b5e0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
2b5f0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
2b600 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
2b610 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
2b620 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
2b630 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
2b640 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
2b650 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
2b660 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
2b670 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
2b680 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20  emory file and, 
2b690 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b6a0 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69   is .** opened i
2b6b0 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65  f it has not bee
2b6c0 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61  n already. For a
2b6d0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2b6e0 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a   the opening .**
2b6f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2b700 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
2b710 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
2b720 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  an actual need t
2b730 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74  o .** write to t
2b740 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f  he journal. TODO
2b750 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d  : Why handle tem
2b760 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66  porary files dif
2b770 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20  ferently?.**.** 
2b780 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
2b790 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f  ile is opened (o
2b7a0 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
2b7b0 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61  dy open), then a
2b7c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  .** journal-head
2b7d0 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  er is written to
2b7e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
2b7f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
2b800 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
2b810 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
2b820 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
2b830 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
2b840 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
2b850 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
2b860 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
2b870 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
2b880 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
2b890 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
2b8a0 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
2b8b0 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
2b8c0 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
2b8d0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
2b8e0 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
2b8f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2b900 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
2b910 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
2b920 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
2b930 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
2b940 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
2b950 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
2b960 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
2b970 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
2b980 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
2b990 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2b9a0 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
2b9b0 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
2b9c0 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
2b9d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2b9e0 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
2b9f0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
2ba00 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
2ba10 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
2ba20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
2ba30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2ba40 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
2ba50 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  CK );.  pPager->
2ba60 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
2ba70 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
2ba80 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2ba90 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
2baa0 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
2bab0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
2bac0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
2bad0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
2bae0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
2baf0 69 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ile );..    if( 
2bb00 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2bb10 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
2bb20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2bb30 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
2bb40 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
2bb50 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
2bb60 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
2bb70 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
2bb80 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
2bb90 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
2bba0 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
2bbb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2bbc0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2bbd0 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
2bbe0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
2bbf0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
2bc00 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
2bc10 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
2bc20 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
2bc30 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
2bc40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
2bc50 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
2bc60 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
2bc70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2bc80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2bc90 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2bca0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2bcb0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
2bcc0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
2bcd0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2bce0 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
2bcf0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
2bd00 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
2bd10 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
2bd20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
2bd30 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2bd40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
2bd50 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
2bd60 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
2bd70 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
2bd80 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
2bd90 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
2bda0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
2bdb0 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
2bdc0 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
2bdd0 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
2bde0 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
2bdf0 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
2be00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2be10 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
2be20 73 20 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f  s Pager.state to
2be30 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2be40 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
2be50 70 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  pen.      ** tra
2be60 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
2be70 76 65 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ver to PAGER_EXC
2be80 4c 55 53 49 56 45 2e 20 54 68 69 73 20 69 73 20  LUSIVE. This is 
2be90 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
2bea0 20 20 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55    ** PAGER_EXCLU
2beb0 53 49 56 45 20 73 74 61 74 65 20 74 68 65 20 63  SIVE state the c
2bec0 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
2bed0 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
2bee0 61 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a  actions.      **
2bef0 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
2bf00 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
2bf10 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
2bf20 61 62 61 73 65 20 66 69 6c 65 20 61 73 20 77 65  abase file as we
2bf30 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  ll.      ** as i
2bf40 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
2bf50 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
2bf60 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
2bf70 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20  WAL mode..      
2bf80 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2bf90 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69  lite3WalBeginWri
2bfa0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
2bfb0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
2bfc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bfd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bfe0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2bff0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2c000 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ize;.        pPa
2c010 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2c020 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
2c030 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2c040 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
2c050 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
2c060 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2c070 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  K || pPager->sta
2c080 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
2c090 45 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ED );.      asse
2c0a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2c0b0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  K || pPager->sta
2c0c0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
2c0d0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
2c0e0 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61       /* Obtain a
2c0f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2c100 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c110 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
2c120 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
2c130 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
2c140 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
2c150 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
2c160 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2c170 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  k. The.      ** 
2c180 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
2c190 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
2c1a0 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
2c1b0 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
2c1c0 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c  E.      ** lock,
2c1d0 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62   but not when ob
2c1e0 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45  taining the RESE
2c1f0 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  RVED lock..     
2c200 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2c210 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
2c220 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
2c230 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
2c240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c250 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
2c260 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2c270 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
2c280 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
2c290 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2c2a0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
2c2b0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
2c2c0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
2c2d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2c2e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20     }..    /* No 
2c2f0 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  need to open the
2c300 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
2c310 20 74 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20   this time.  It 
2c320 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f  will be.    ** o
2c330 70 65 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20  pened before it 
2c340 69 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  is written to.  
2c350 49 66 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e  If we defer open
2c360 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  ing the journal,
2c370 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74  .    ** we might
2c380 20 73 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f   save the work o
2c390 66 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c  f creating a fil
2c3a0 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
2c3b0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73  tion.    ** ends
2c3c0 20 75 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f   up being a no-o
2c3d0 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73  p..    */.  }els
2c3e0 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61  e if( isOpen(pPa
2c3f0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
2c400 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
2c410 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
2c420 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
2c430 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
2c440 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
2c450 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
2c460 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
2c470 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
2c480 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
2c490 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
2c4a0 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
2c4b0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
2c4c0 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
2c4d0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2c4e0 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
2c4f0 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
2c500 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
2c510 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
2c520 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
2c530 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
2c540 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
2c550 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2c560 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
2c570 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
2c580 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c590 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
2c5a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c5b0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
2c5c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c5d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2c5e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
2c5f0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
2c600 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
2c610 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2c620 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
2c630 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2c640 65 72 29 29 29 3b 0a 20 20 69 66 28 20 72 63 21  er)));.  if( rc!
2c650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c660 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2c670 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b  r->dbModified );
2c680 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61  .    /* Ignore a
2c690 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74  ny IO error that
2c6a0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70   occurs within p
2c6b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2c6c0 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20  tion(). The.    
2c6d0 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  ** purpose of th
2c6e0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65  is call is to re
2c6f0 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  set the internal
2c700 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
2c710 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73  ger.    ** sub-s
2c720 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27  ystem. It doesn'
2c730 74 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20  t matter if the 
2c740 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
2c750 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20  not properly.   
2c760 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74   ** finalized at
2c770 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e   this point (sin
2c780 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76  ce it is not a v
2c790 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
2c7a0 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a  e anyway)..    *
2c7b0 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f  /.    pager_end_
2c7c0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2c7d0 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  er, 0);.  }.  re
2c7e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c7f0 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
2c800 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
2c810 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
2c820 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2c830 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
2c840 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
2c850 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
2c860 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
2c870 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2c880 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
2c890 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
2c8a0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
2c8b0 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
2c8c0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
2c8d0 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
2c8e0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
2c8f0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
2c900 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
2c910 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
2c920 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
2c930 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2c940 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
2c950 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
2c960 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2c970 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c980 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2c990 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c9a0 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72  OK;..  /* This r
2c9b0 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61  outine is not ca
2c9c0 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72  lled unless a tr
2c9d0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
2c9e0 72 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20  ready been.  ** 
2c9f0 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
2ca00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ca10 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
2ca20 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49  ERVED );..  /* I
2ca30 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62  f an error has b
2ca40 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64  een previously d
2ca50 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20  etected, report 
2ca60 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20  the same error. 
2ca70 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a   ** again..  */.
2ca80 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2ca90 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20  er->errCode) )  
2caa0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
2cab0 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69  rrCode;..  /* Hi
2cac0 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69  gher-level routi
2cad0 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74  nes never call t
2cae0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
2caf0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a  database is not.
2cb00 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20    ** writable.  
2cb10 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79  But check anyway
2cb20 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73  , just for robus
2cb30 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20  tness. */.  if( 
2cb40 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65  NEVER(pPager->re
2cb50 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e  adOnly) ) return
2cb60 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20   SQLITE_PERM;.. 
2cb70 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2cb80 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
2cb90 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
2cba0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
2cbb0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
2cbc0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
2cbd0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
2cbe0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
2cbf0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
2cc00 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
2cc10 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
2cc20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2cc30 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
2cc40 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  if( pageInJourna
2cc50 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52  l(pPg) && !subjR
2cc60 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
2cc70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2cc80 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2cc90 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67  ger) );.    pPag
2cca0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
2ccb0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
2ccc0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
2ccd0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
2cce0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2ccf0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
2cd00 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
2cd10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
2cd20 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
2cd30 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
2cd40 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
2cd50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69      **.    ** Hi
2cd60 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
2cd70 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20  nes should have 
2cd80 61 6c 72 65 61 64 79 20 73 74 61 72 74 65 64 20  already started 
2cd90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  a transaction,. 
2cda0 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e     ** which mean
2cdb0 73 20 74 68 65 79 20 68 61 76 65 20 61 63 71 75  s they have acqu
2cdc0 69 72 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ired the necessa
2cdd0 72 79 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65  ry locks but the
2cde0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a   rollback.    **
2cdf0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e   journal might n
2ce00 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a  ot yet be open..
2ce10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2ce20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
2ce30 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61  n(pPager, 0, pPa
2ce40 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2ce50 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
2ce60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ce70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ce80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
2ce90 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
2cea0 30 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72  0.     && pPager
2ceb0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2cec0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ced0 5f 4f 46 46 20 0a 20 20 20 20 20 26 26 20 21 70  _OFF .     && !p
2cee0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2cef0 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  r).    ){.      
2cf00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2cf10 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2cf20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
2cf30 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
2cf40 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
2cf50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2cf60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2cf70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
2cf80 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20  dified = 1;.  . 
2cf90 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
2cfa0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
2cfb0 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
2cfc0 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
2cfd0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
2cfe0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2cff0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2d000 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
2d010 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
2d020 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
2d030 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
2d040 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
2d050 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
2d060 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67   */.    if( !pag
2d070 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
2d080 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2d090 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2d0a0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
2d0b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2d0c0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
2d0d0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
2d0e0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
2d0f0 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
2d100 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2d110 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  a2;..        /* 
2d120 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
2d130 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
2d140 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
2d150 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
2d160 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
2d170 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
2d180 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
2d190 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
2d1a0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
2d1b0 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
2d1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
2d1d0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
2d1e0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
2d1f0 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
2d200 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2d210 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
2d220 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
2d230 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2d240 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2d250 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2d260 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
2d270 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
2d280 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
2d290 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
2d2a0 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
2d2b0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
2d2c0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
2d2d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d2e0 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
2d2f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2d300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d310 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d320 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2d330 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
2d340 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2d350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d380 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20  ff + 4);.       
2d390 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2d3a0 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
2d3b0 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20  >pageSize+4;.   
2d3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2d3d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d3e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2d3f0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2d400 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
2d410 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
2d420 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
2d430 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d440 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20  lOff += 4;.     
2d450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
2d460 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
2d470 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
2d480 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
2d490 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2d4a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2d4b0 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
2d4c0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
2d4d0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
2d4e0 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2d4f0 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
2d500 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2d510 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2d520 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
2d530 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
2d540 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2d550 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2d560 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
2d570 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
2d580 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2d590 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
2d5a0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
2d5b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
2d5c0 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
2d5d0 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
2d5e0 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e  rred while journ
2d5f0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
2d600 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2d610 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
2d620 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
2d630 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
2d640 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
2d650 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
2d660 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2d670 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
2d680 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
2d690 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
2d6a0 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
2d6b0 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
2d6c0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
2d6d0 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
2d6e0 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
2d6f0 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
2d700 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2d710 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
2d720 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
2d730 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
2d740 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
2d750 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2d760 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
2d770 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
2d780 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
2d790 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
2d7a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2d7b0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2d7c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2d7d0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
2d7e0 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e   occurred writin
2d7f0 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
2d800 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
2d810 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
2d820 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
2d830 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
2d840 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
2d850 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
2d860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2d880 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2d890 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  }..        pPage
2d8a0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
2d8b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d8c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
2d8d0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2d8e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
2d8f0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
2d900 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
2d910 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2d920 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
2d930 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2d940 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2d950 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
2d960 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
2d970 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
2d980 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
2d990 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
2d9a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
2d9b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2d9d0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
2d9e0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2d9f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2da00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2da10 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
2da20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
2da30 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
2da40 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2da50 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
2da60 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
2da70 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
2da80 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2da90 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
2daa0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
2dab0 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
2dac0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
2dad0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
2dae0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
2daf0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2db00 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
2db10 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
2db20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2db30 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
2db40 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2db50 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
2db60 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
2db70 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
2db80 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
2db90 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
2dba0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2dbb0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
2dbc0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
2dbd0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
2dbe0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2dbf0 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
2dc00 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
2dc10 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
2dc20 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
2dc30 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
2dc40 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
2dc50 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
2dc60 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
2dc70 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2dc80 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
2dc90 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
2dca0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2dcb0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
2dcc0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
2dcd0 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
2dce0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2dcf0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
2dd00 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2dd10 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
2dd20 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
2dd30 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
2dd40 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
2dd50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2dd60 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
2dd70 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
2dd80 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
2dd90 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
2dda0 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e   .** making chan
2ddb0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54  ges to a page. T
2ddc0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
2ddd0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
2dde0 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  value .** of thi
2ddf0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62  s function and b
2de00 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
2de10 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
2de20 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a   data unless .**
2de30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2de40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2de50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2de60 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2de70 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
2de80 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
2de90 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
2dea0 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
2deb0 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
2dec0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
2ded0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
2dee0 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
2def0 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
2df00 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
2df10 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
2df20 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
2df30 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
2df40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
2df50 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2df60 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2df70 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
2df80 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
2df90 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2dfa0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70  eturned.** as ap
2dfb0 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72  propriate. Other
2dfc0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
2dfd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2dfe0 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
2dff0 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
2e000 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e010 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
2e020 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
2e030 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2e040 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
2e050 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
2e060 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
2e070 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
2e080 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  geSize);..  if( 
2e090 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
2e0a0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
2e0b0 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
2e0c0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
2e0d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
2e0e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2e0f0 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e110 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
2e120 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
2e130 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
2e140 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e160 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2e170 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
2e180 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
2e190 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e1b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2e1c0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
2e1d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
2e1e0 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
2e1f0 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
2e200 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  SYNC */..    /* 
2e210 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
2e220 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
2e230 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
2e240 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
2e250 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
2e260 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
2e270 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
2e280 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
2e290 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
2e2a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2e2b0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
2e2c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e2d0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
2e2e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
2e2f0 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
2e300 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
2e310 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
2e320 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
2e330 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
2e340 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
2e350 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
2e360 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
2e370 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
2e380 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
2e390 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
2e3a0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
2e3b0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
2e3c0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
2e3d0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
2e3e0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
2e3f0 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
2e400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e410 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
2e420 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
2e430 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20  PageCount);.    
2e440 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2e450 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  rc;.    if( pPg-
2e460 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
2e470 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
2e480 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
2e490 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
2e4a0 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
2e4b0 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
2e4c0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
2e4d0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
2e4e0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
2e4f0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
2e500 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
2e510 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
2e520 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
2e530 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
2e540 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
2e550 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
2e560 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
2e570 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2e580 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
2e590 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
2e5a0 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
2e5b0 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
2e5c0 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
2e5d0 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
2e5e0 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
2e5f0 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
2e600 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
2e610 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
2e620 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
2e630 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2e640 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e650 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2e660 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
2e670 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2e680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e690 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e6a0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
2e6b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2e6c0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
2e6d0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2e6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e6f0 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
2e710 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
2e720 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
2e730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e740 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2e750 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2e760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e770 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2e780 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
2e790 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
2e7a0 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
2e7b0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
2e7c0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2e7d0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
2e7e0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
2e7f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e800 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2e810 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
2e820 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2e830 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45   If the PGHDR_NE
2e840 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
2e850 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
2e860 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
2e870 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
2e880 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
2e890 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
2e8a0 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
2e8b0 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
2e8c0 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
2e8d0 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
2e8e0 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
2e8f0 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
2e900 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
2e910 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
2e920 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
2e930 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
2e940 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
2e950 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
2e960 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
2e970 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e980 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2e9a0 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  & needSync ){.  
2e9b0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
2e9c0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f  DB && pPager->no
2e9d0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
2e9e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
2e9f0 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
2ea00 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
2ea10 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
2ea20 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
2ea30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2ea40 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
2ea50 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
2ea60 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2ea70 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2ea80 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2ea90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2eaa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2eab0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
2eac0 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
2ead0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eae0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
2eaf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
2eb00 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
2eb10 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
2eb20 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
2eb30 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
2eb40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2eb50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2eb60 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
2eb70 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
2eb80 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
2eb90 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
2eba0 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
2ebb0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
2ebc0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
2ebd0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
2ebe0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
2ebf0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
2ec00 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
2ec10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
2ec20 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
2ec30 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
2ec40 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
2ec50 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
2ec60 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
2ec70 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
2ec80 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
2ec90 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2eca0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
2ecb0 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
2ecc0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
2ecd0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
2ece0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
2ecf0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
2ed00 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
2ed10 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
2ed20 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
2ed30 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
2ed40 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
2ed50 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
2ed60 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
2ed70 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
2ed80 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
2ed90 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
2eda0 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
2edb0 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
2edc0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
2edd0 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
2ede0 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
2edf0 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
2ee00 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
2ee10 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2ee20 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
2ee30 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
2ee40 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
2ee50 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
2ee60 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
2ee70 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72  zation can quadr
2ee80 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
2ee90 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45  f large .** DELE
2eea0 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  TE operations..*
2eeb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
2eec0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48  gerDontWrite(PgH
2eed0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2eee0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2eef0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28  >pPager;.  if( (
2ef00 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ef10 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65  _DIRTY) && pPage
2ef20 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30  r->nSavepoint==0
2ef30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2ef40 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE(("DONT_WRITE 
2ef50 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
2ef60 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
2ef70 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2ef80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
2ef90 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
2efa0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2efb0 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ).    pPg->flags
2efc0 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57   |= PGHDR_DONT_W
2efd0 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c  RITE;.#ifdef SQL
2efe0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2eff0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
2f000 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
2f010 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
2f020 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2f030 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2f040 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
2f050 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2f060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f070 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  .** change-count
2f080 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
2f090 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2f0a0 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69  n integer starti
2f0b0 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f  ng at .** byte o
2f0c0 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
2f0d0 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  pager file..**.*
2f0e0 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63  * If the isDirec
2f0f0 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65  tMode flag is ze
2f100 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  ro, then this is
2f110 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67   done by calling
2f120 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
2f130 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65  rWrite() on page
2f140 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69   1, then modifyi
2f150 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
2f160 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64  of the.** page d
2f170 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ata. In this cas
2f180 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  e the file will 
2f190 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20  be updated when 
2f1a0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
2f1b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2f1c0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
2f1d0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
2f1e0 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65  flag may only be
2f1f0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2f200 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
2f210 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  piled.** with th
2f220 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
2f230 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63  ATOMIC_WRITE mac
2f240 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74  ro defined. In t
2f250 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20  his case,.** if 
2f260 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d  isDirect is non-
2f270 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
2f280 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2f290 75 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79  updated directly
2f2a0 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61  .** by writing a
2f2b0 6e 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f  n updated versio
2f2c0 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e  n of page 1 usin
2f2d0 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20  g a call to the 
2f2e0 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69  .** sqlite3OsWri
2f2f0 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  te() function..*
2f300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2f310 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2f320 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
2f330 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63  ger, int isDirec
2f340 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63  tMode){.  int rc
2f350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2f360 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20   /* Declare and 
2f370 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74  initialize const
2f380 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44  ant integer 'isD
2f390 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20  irect'. If the. 
2f3a0 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65   ** atomic-write
2f3b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2f3c0 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73   enabled in this
2f3d0 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44   build, then isD
2f3e0 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e  irect.  ** is in
2f3f0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
2f400 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
2f410 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
2f420 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  e parameter.  **
2f430 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f440 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
2f450 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
2f460 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
2f470 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2f480 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63  at if the atomic
2f490 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2f4a0 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ion is not.  ** 
2f4b0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2f4c0 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d  le time, the com
2f4d0 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74  piler can omit t
2f4e0 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a  he tests of.  **
2f4f0 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f   'isDirect' belo
2f500 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  w, as well as th
2f510 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64  e block enclosed
2f520 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66   in the.  ** "if
2f530 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f  ( isDirect )" co
2f540 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ndition..  */.#i
2f550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
2f560 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
2f570 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
2f580 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74  _MODE 0.  assert
2f590 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d  ( isDirectMode==
2f5a0 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
2f5b0 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74  RAMETER(isDirect
2f5c0 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64  Mode);.#else.# d
2f5d0 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
2f5e0 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23  E isDirectMode.#
2f5f0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2f600 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2f610 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2f620 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
2f630 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2f640 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
2f650 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64  ze>0 ){.    PgHd
2f660 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20  r *pPgHdr;      
2f670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
2f680 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2f690 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e   */.    u32 chan
2f6a0 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20  ge_counter;     
2f6b0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2f6c0 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65   value of change
2f6d0 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a  -counter field *
2f6e0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2f6f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2f700 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2f710 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f  r->fd) );..    /
2f720 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
2f730 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
2f740 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
2f750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2f760 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
2f770 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65  PgHdr);.    asse
2f780 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c  rt( pPgHdr==0 ||
2f790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f7a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67  ;..    /* If pag
2f7b0 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65  e one was fetche
2f7c0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
2f7d0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
2f7e0 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  n is not.    ** 
2f7f0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72  operating in dir
2f800 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70  ect-mode, make p
2f810 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20  age 1 writable. 
2f820 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20   When not in .  
2f830 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65    ** direct mode
2f840 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61  , page 1 is alwa
2f850 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  ys held in cache
2f860 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50   and hence the P
2f870 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a  agerGet().    **
2f880 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73   above is always
2f890 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65   successful - he
2f8a0 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f  nce the ALWAYS o
2f8b0 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e  n rc==SQLITE_OK.
2f8c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2f8d0 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20  !DIRECT_MODE && 
2f8e0 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54  ALWAYS(rc==SQLIT
2f8f0 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  E_OK) ){.      r
2f900 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f910 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
2f920 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
2f930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f940 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
2f950 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
2f960 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
2f970 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
2f980 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  24. */.      cha
2f990 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
2f9a0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
2f9b0 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
2f9c0 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68  eVers);.      ch
2f9d0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
2f9e0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
2f9f0 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e  ((char*)pPgHdr->
2fa00 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
2fa10 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  e_counter);..   
2fa20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65     /* Also store
2fa30 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
2fa40 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79  ion number in by
2fa50 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69  tes 96..99 and i
2fa60 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  n.      ** bytes
2fa70 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
2fa80 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
2fa90 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
2faa0 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
2fab0 20 20 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e      ** is valid.
2fac0 20 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62   */.      put32b
2fad0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
2fae0 64 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  dr->pData)+92, c
2faf0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
2fb00 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
2fb10 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e  ((char*)pPgHdr->
2fb20 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
2fb30 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
2fb40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2fb50 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63  running in direc
2fb60 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68  t mode, write th
2fb70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  e contents of pa
2fb80 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65  ge 1 to the file
2fb90 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44  . */.      if( D
2fba0 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20  IRECT_MODE ){.  
2fbb0 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
2fbc0 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d   *zBuf = pPgHdr-
2fbd0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >pData;.        
2fbe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fbf0 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
2fc00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fc10 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2fc20 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
2fc30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2fc40 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2fc50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fc60 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2fc70 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2fc80 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
2fc90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2fca0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
2fcb0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2fcc0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2fcd0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
2fce0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
2fcf0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
2fd00 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2fd10 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
2fd20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2fd30 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
2fd40 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
2fd50 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
2fd60 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
2fd70 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77  es.** or pages w
2fd80 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f  ith the Pager.no
2fd90 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a  Sync flag set..*
2fda0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2fdb0 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e  ul, or called on
2fdc0 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
2fdd0 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
2fde0 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
2fdf0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2fe00 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
2fe10 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2fe20 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2fe30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2fe40 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
2fe50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fe80 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2fe90 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2fea0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2feb0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2fec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2fed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2fee0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2fef0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2ff00 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2ff10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ff20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2ff30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ff40 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
2ff50 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
2ff60 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
2ff70 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
2ff80 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
2ff90 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
2ffa0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
2ffb0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
2ffc0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
2ffd0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
2ffe0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
2fff0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
30000 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
30010 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
30020 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
30030 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
30040 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
30050 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
30060 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
30070 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
30080 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
30090 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
300a0 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
300b0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
300c0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
300d0 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
300e0 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
300f0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
30100 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
30110 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
30120 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
30130 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
30140 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
30150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
30160 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
30170 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
30180 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
30190 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
301a0 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
301b0 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
301c0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
301d0 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
301e0 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
301f0 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
30200 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
30210 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
30220 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
30230 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
30240 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
30250 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
30260 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
30270 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
30280 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
30290 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
302a0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
302b0 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
302c0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
302d0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
302e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
302f0 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
30300 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
30310 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
30320 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
30330 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
30340 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
30350 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
30360 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
30370 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
30380 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
30390 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
303a0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
303b0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
303c0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
303d0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
303e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
303f0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
30400 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
30410 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
30420 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
30430 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
30440 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
30450 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
30460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30470 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
30480 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
30490 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
304a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
304b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
304c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
304d0 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69   /* The dbOrigSi
304e0 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20  ze is never set 
304f0 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
30500 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  OFF */.  assert(
30510 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30520 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
30530 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70  NALMODE_OFF || p
30540 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
30550 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  e==0 );..  /* If
30560 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f   a prior error o
30570 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20  ccurred, report 
30580 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e  that error again
30590 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
305a0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
305b0 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
305c0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50  r->errCode;..  P
305d0 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41  AGERTRACE(("DATA
305e0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
305f0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53  %s zMaster=%s nS
30600 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  ize=%d\n", .    
30610 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
30620 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  ame, zMaster, pP
30630 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a  ager->dbSize));.
30640 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  .  if( MEMDB && 
30650 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
30660 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ed ){.    /* If 
30670 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
30680 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
30690 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
306a0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
306b0 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
306c0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
306d0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
306e0 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
306f0 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
30700 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
30710 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
30720 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
30730 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
30740 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
30750 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
30760 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
30770 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
30780 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50  GER_SYNCED && pP
30790 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
307a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65   ){.    if( page
307b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
307c0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
307d0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
307e0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
307f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
30800 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
30810 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
30820 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
30830 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
30840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
30850 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
30860 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
30870 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f   ? pPager->sync_
30880 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20  flags : 0).     
30890 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
308a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
308b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
308c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
308d0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
308e0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 7d  PCache);.      }
308f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30900 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
30910 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
30920 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
30930 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
30940 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65   it.      ** doe
30950 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
30960 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
30970 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
30980 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
30990 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61        ** was ena
309a0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
309b0 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69  time, and if thi
309c0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65  s transaction me
309d0 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ets the .      *
309e0 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65 72  * runtime criter
309f0 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f 70  ia to use the op
30a00 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20  eration: .      
30a10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  **.      **    *
30a20 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
30a30 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
30a40 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
30a50 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  rty for.      **
30a60 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
30a70 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
30a80 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20 20  and .      **   
30a90 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
30aa0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
30ab0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
30ac0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
30ad0 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
30ae0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
30af0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
30b00 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
30b10 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
30b20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
30b30 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
30b40 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65  n was not enable
30b50 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
30b60 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  e, then the.    
30b70 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30b80 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30b90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30ba0 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  ed to update the
30bb0 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a   change.      **
30bc0 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
30bd0 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
30be0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
30bf0 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
30c00 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  but.      ** is 
30c10 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
30c20 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
30c30 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
30c40 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
30c50 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65        ** to make
30c60 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
30c70 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
30c80 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
30c90 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
30ca0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
30cb0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
30cc0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
30cd0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
30ce0 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20 2a  indirect.      *
30cf0 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a  * mode. .      *
30d00 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  *.      ** Other
30d10 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74  wise, if the opt
30d20 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74  imization is bot
30d30 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70  h enabled and ap
30d40 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20  plicable,.      
30d50 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61 67  ** then call pag
30d60 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
30d70 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74  unter() to updat
30d80 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
30d90 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e  nter.      ** in
30da0 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
30db0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
30dc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
30dd0 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
30de0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
30df0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30e00 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  n..      */.  #i
30e10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
30e20 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
30e30 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
30e40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30e50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30e60 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
30e70 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
30e80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
30e90 46 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  F );.      if( !
30ea0 7a 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65  zMaster && isOpe
30eb0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
30ec0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
30ed0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72  ->journalOff==jr
30ee0 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61  nlBufferSize(pPa
30ef0 67 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  ger) .       && 
30f00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
30f10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
30f20 7a 65 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d  ze.       && (0=
30f30 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
30f40 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
30f50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
30f60 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
30f70 74 79 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ty).      ){.   
30f80 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
30f90 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
30fa0 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
30fb0 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
30fc0 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
30fd0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
30fe0 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
30ff0 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
31000 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
31010 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
31020 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
31030 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
31040 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
31050 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
31060 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72   .        ** dir
31070 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
31080 61 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61  abase file. Beca
31090 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
310a0 63 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 20  c-write .       
310b0 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20   ** property of 
310c0 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
310d0 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61  stem, this is sa
310e0 66 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  fe..        */. 
310f0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31100 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
31110 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
31120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31130 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31140 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
31150 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
31160 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31180 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
31190 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
311a0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
311b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
311c0 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72  .  #else.      r
311d0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
311e0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
311f0 67 65 72 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69  ger, 0);.  #endi
31200 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  f.      if( rc!=
31210 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31220 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31230 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
31240 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
31250 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
31260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
31270 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
31280 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 62  pages.      ** b
31290 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
312a0 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
312b0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
312c0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
312d0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54        ** file. T
312e0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
312f0 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  pen in auto-vacu
31300 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  um mode..      *
31310 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
31320 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
31330 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
31340 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
31350 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31360 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
31370 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
31380 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
31390 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
313a0 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
313b0 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
313c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
313d0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
313e0 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73  e.      ** calls
313f0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
31400 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
31410 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
31420 64 20 6f 66 20 0a 20 20 20 20 20 20 2a 2a 20 72  d of .      ** r
31430 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
31440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31450 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
31460 20 20 20 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e     ** When journ
31470 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65  al_mode==OFF the
31480 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61   dbOrigSize is a
31490 6c 77 61 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74  lways zero, so t
314a0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  his.      ** blo
314b0 63 6b 20 6e 65 76 65 72 20 72 75 6e 73 20 69 66  ck never runs if
314c0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46   journal_mode=OF
314d0 46 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23 69  F..      */.  #i
314e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
314f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31500 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
31510 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
31520 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 20  OrigSize .      
31530 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65   && ALWAYS(pPage
31540 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
31550 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31560 45 5f 4f 46 46 29 0a 20 20 20 20 20 20 29 7b 0a  E_OFF).      ){.
31570 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20          Pgno i; 
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315a0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
315b0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  riable */.      
315c0 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b    const Pgno iSk
315d0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
315e0 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20 50  NO(pPager); /* P
315f0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65  ending lock page
31600 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
31610 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20  t Pgno dbSize = 
31620 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20  pPager->dbSize; 
31630 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
31640 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20  e image size */ 
31650 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
31660 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
31670 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
31680 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
31690 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
316a0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
316b0 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
316c0 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
316d0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
316e0 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
316f0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
31700 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
31710 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
31720 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75    /* Page to jou
31730 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  rnal */.        
31740 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31750 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
31760 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
31770 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
31780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31790 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
317a0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
317b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
317c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
317d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
317e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
317f0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
31800 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31810 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
31820 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
31830 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
31840 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31850 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
31860 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
31870 20 20 20 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20     } .  #endif. 
31880 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65   .      /* Write
31890 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
318a0 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
318b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
318c0 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20  If a master .   
318d0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
318e0 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
318f0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
31900 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
31910 66 69 6c 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20  file, .      ** 
31920 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
31930 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
31940 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
31950 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
31960 6f 2d 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  o-op..      */. 
31970 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
31980 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
31990 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
319a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
319b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
319c0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
319d0 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
319e0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
319f0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 61  l file. If the a
31a00 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
31a10 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
31a20 6e 67 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64  ng.      ** used
31a30 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c  , this call will
31a40 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20   not create the 
31a50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
31a60 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20  perform any.    
31a70 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20    ** real IO..  
31a80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
31a90 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
31aa0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
31ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31ac0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31ad0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
31ae0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61        /* Write a
31af0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
31b00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31b10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ile. */.      rc
31b20 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
31b30 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33 50  agelist(sqlite3P
31b40 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
31b50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
31b60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31b80 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
31b90 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
31ba0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 20  OCKED );.       
31bb0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31bc0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31bd0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
31be0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
31bf0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
31c00 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  );.  .      /* I
31c10 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
31c20 73 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61  sk is not the sa
31c30 6d 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64  me size as the d
31c40 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20  atabase image,. 
31c50 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65       ** then use
31c60 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 20   pager_truncate 
31c70 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69 6e  to grow or shrin
31c80 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65 2e  k the file here.
31c90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31ca0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
31cb0 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze!=pPager->dbFi
31cc0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
31cd0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
31ce0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
31cf0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
31d00 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
31d10 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
31d20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31d30 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
31d40 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20  LUSIVE );.      
31d50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
31d60 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e  ncate(pPager, nN
31d70 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
31d80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31d90 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31da0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
31db0 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
31dc0 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74   Finally, sync t
31dd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31de0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  . */.      if( !
31df0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
31e00 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
31e10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31e20 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
31e30 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
31e40 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d  _flags);.      }
31e50 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
31e60 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
31e70 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20  Pager)).    }.. 
31e80 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
31e90 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
31ea0 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61  .  }..commit_pha
31eb0 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72  se_one_exit:.  r
31ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
31ed0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
31ee0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
31ef0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
31f00 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
31f10 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
31f20 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
31f30 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
31f40 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
31f50 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
31f60 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
31f70 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
31f80 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
31f90 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
31fa0 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
31fb0 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
31fc0 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
31fd0 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
31fe0 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
31ff0 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
32000 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
32010 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
32020 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
32030 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32040 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
32050 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
32060 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
32070 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
32080 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
32090 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
320a0 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
320b0 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
320c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
320d0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
320e0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
320f0 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
32100 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
32110 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
32120 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
32130 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
32140 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
32150 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
32160 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
32170 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
32180 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
32190 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
321a0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
321b0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
321c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
321d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
321e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
321f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
32200 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
32210 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ne should not be
32220 20 63 61 6c 6c 65 64 20 69 66 20 61 20 70 72 69   called if a pri
32230 6f 72 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  or error has occ
32240 75 72 72 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20  urred..  ** But 
32250 69 66 20 28 64 75 65 20 74 6f 20 61 20 63 6f 64  if (due to a cod
32260 69 6e 67 20 65 72 72 6f 72 20 65 6c 73 65 77 68  ing error elsewh
32270 65 72 65 20 69 6e 20 74 68 65 20 73 79 73 74 65  ere in the syste
32280 6d 29 20 69 74 20 64 6f 65 73 20 67 65 74 0a 20  m) it does get. 
32290 20 2a 2a 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74   ** called, just
322a0 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
322b0 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 74 68   error code with
322c0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
322d0 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ng. */.  if( NEV
322e0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
322f0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
32300 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
32310 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
32320 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
32330 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61  called if the pa
32340 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74  ger is not in at
32350 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45   least.  ** PAGE
32360 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
32370 2e 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c  . And indeed SQL
32380 69 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74  ite never does t
32390 68 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20  his. But it is. 
323a0 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65   ** nice to have
323b0 20 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20   this defensive 
323c0 74 65 73 74 20 68 65 72 65 20 61 6e 79 77 61 79  test here anyway
323d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
323e0 45 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ER(pPager->state
323f0 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29  <PAGER_RESERVED)
32400 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
32410 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e  _ERROR;..  /* An
32420 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49   optimization. I
32430 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  f the database w
32440 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
32450 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a  modified during.
32460 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
32470 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72  ction, the pager
32480 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
32490 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e  xclusive-mode an
324a0 64 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20  d is.  ** using 
324b0 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
324c0 61 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66  als, then this f
324d0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
324e0 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  op..  **.  ** Th
324f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
32500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72  ournal file curr
32510 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61  ently contains a
32520 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20   single journal 
32530 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74  .  ** header wit
32540 68 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  h the nRec field
32550 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75   set to 0. If su
32560 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ch a journal is 
32570 75 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68  used as.  ** a h
32580 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e  ot-journal durin
32590 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
325a0 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65  llback, 0 change
325b0 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20  s will be made. 
325c0 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
325d0 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65  ase file. So the
325e0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
325f0 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61   zero the journa
32600 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20  l .  ** header. 
32610 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
32620 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
32630 6d 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e  mode, there is n
32640 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64  o need.  ** to d
32650 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69  rop any locks ei
32660 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ther..  */.  if(
32670 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
32680 69 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ied==0 && pPager
32690 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
326a0 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  .   && pPager->j
326b0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
326c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
326d0 52 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61  RSIST.  ){.    a
326e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
326f0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
32700 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
32710 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
32720 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
32730 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
32740 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
32750 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
32760 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32770 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
32780 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c  YNCED || MEMDB |
32790 7c 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  | !pPager->dbMod
327a0 69 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ified );.  rc = 
327b0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
327c0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
327d0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
327e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ;.  return pager
327f0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
32800 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  c);.}../*.** Rol
32810 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
32820 73 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  s. The database 
32830 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
32840 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
32850 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
32860 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77  tion performs tw
32870 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20  o tasks:.**.**  
32880 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63   1) It rolls bac
32890 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
328a0 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c  le, restoring al
328b0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
328c0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d  and .**      in-
328d0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
328e0 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  es to the state 
328f0 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65  they were in whe
32900 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
32910 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70  n.**      was op
32920 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32  ened, and.**   2
32930 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74  ) It finalizes t
32940 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
32950 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e   so that it is n
32960 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a  ot used for hot.
32970 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
32980 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e   at any point in
32990 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a   the future..**.
329a0 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68  ** subject to th
329b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c  e following qual
329c0 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a  ifications:.**.*
329d0 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  * * If the journ
329e0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79  al file is not y
329f0 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  et open when thi
32a00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32a10 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20  lled,.**   then 
32a20 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66  only (2) is perf
32a30 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ormed. In this c
32a40 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
32a50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
32a60 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a    to roll back..
32a70 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e  **.** * If in an
32a80 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
32a90 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
32aa0 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28  ULL, then task (
32ab0 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66  1) is .**   perf
32ac0 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73  ormed. If succes
32ad0 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20  sful, task (2). 
32ae0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
32af0 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f  e outcome.**   o
32b00 66 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72  f either, the er
32b10 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
32b20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32b30 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a   to the caller.*
32b40 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72  *   (i.e. either
32b50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
32b60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
32b70 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  ..**.** * If the
32b80 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
32b90 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
32ba0 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
32bb0 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20  (1). Whether.** 
32bc0 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20    or not (1) is 
32bd0 73 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f  succussful, also
32be0 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66   attempt (2). If
32bf0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
32c00 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  urn.**   SQLITE_
32c10 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  OK. Otherwise, e
32c20 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
32c30 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tate and return 
32c40 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20  the first .**   
32c50 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75  error code encou
32c60 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20  ntered. .**.**  
32c70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32c80 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
32c90 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
32ca0 73 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  se was written t
32cb0 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73  o. .**   So is s
32cc0 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  afe to finalize 
32cd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32ce0 20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61   even if the pla
32cf0 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65  yback .**   (ope
32d00 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64  ration 1) failed
32d10 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61  . However the pa
32d20 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74  ger must enter t
32d30 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a  he error state.*
32d40 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65  *   as the conte
32d50 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
32d60 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e  mory cache are n
32d70 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a  ow suspect..**.*
32d80 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  * * Finally, if 
32d90 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
32da0 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  VE state, then a
32db0 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79  ttempt (1). Only
32dc0 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32  .**   attempt (2
32dd0 29 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63  ) if (1) is succ
32de0 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53  essful. Return S
32df0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
32e00 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68  essful,.**   oth
32e10 65 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65  erwise enter the
32e20 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
32e30 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
32e40 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20  r code from the 
32e50 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70  .**   failing op
32e60 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  eration..**.**  
32e70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32e80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32e90 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72  may have been wr
32ea0 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20  itten to. So if 
32eb0 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63  the.**   playbac
32ec0 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20  k operation did 
32ed0 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77  not succeed it w
32ee0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65  ould not be safe
32ef0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20   to finalize.** 
32f00 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
32f10 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20  le. It needs to 
32f20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
32f30 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68  ile-system so th
32f40 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68  at.**   some oth
32f50 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75  er process can u
32f60 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  se it to restore
32f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74   the database st
32f80 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74  ate (by.**   hot
32f90 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
32fa0 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  k)..*/.int sqlit
32fb0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
32fc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32fd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
32fe0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
32ff0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
33000 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52   code */.  PAGER
33010 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b  TRACE(("ROLLBACK
33020 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
33030 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28  pPager)));.  if(
33040 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33050 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ger) ){.    int 
33060 72 63 32 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  rc2;..    rc = s
33070 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
33080 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 53 41 56  oint(pPager, SAV
33090 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
330a0 20 2d 31 29 3b 0a 20 20 20 20 72 63 32 20 3d 20   -1);.    rc2 = 
330b0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
330c0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
330d0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
330e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
330f0 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
33100 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
33110 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
33120 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66   rc);.  }else if
33130 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  ( !pPager->dbMod
33140 69 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e  ified || !isOpen
33150 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
33160 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
33170 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
33180 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
33190 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65  setMaster);.  }e
331a0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
331b0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
331c0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
331d0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
331e0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
331f0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
33200 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
33210 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
33220 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
33230 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
33240 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
33250 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
33260 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
33270 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  RVED ){.      in
33280 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20  t rc2;.      rc 
33290 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
332a0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
332b0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
332c0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
332d0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
332e0 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  etMaster);.     
332f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
33310 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
33320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33330 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
33340 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
33350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33360 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
33370 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
33380 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  lid = 0;.    }..
33390 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
333a0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
333b0 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
333c0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
333d0 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
333e0 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
333f0 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
33400 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
33410 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
33420 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69  or .    ** persi
33430 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  stent..    */.  
33440 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
33450 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
33460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33480 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
33490 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
334a0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
334b0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
334c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
334d0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
334e0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20  writable..*/.u8 
334f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
33500 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
33510 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
33520 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
33530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
33540 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
33550 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
33560 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
33570 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
33580 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
33590 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
335a0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
335b0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
335c0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
335d0 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 78  eturn the approx
335e0 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  imate number of 
335f0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
33600 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65  currently.** use
33610 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 61  d by the pager a
33620 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
33630 64 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20  d cache..*/.int 
33640 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65 6d 55  sqlite3PagerMemU
33650 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
33660 72 29 7b 0a 20 20 69 6e 74 20 70 65 72 50 61 67  r){.  int perPag
33670 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
33680 70 61 67 65 53 69 7a 65 20 2b 20 70 50 61 67 65  pageSize + pPage
33690 72 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30 3b 0a  r->nExtra + 20;.
336a0 20 20 72 65 74 75 72 6e 20 70 65 72 50 61 67 65    return perPage
336b0 53 69 7a 65 2a 73 71 6c 69 74 65 33 50 63 61 63  Size*sqlite3Pcac
336c0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
336d0 65 72 2d 3e 70 50 43 61 63 68 65 29 0a 20 20 20  er->pPCache).   
336e0 20 20 20 20 20 20 20 20 2b 20 73 71 6c 69 74 65          + sqlite
336f0 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50 61 67  3MallocSize(pPag
33700 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
33710 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
33720 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
33730 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
33740 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
33750 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
33760 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61  ount(DbPage *pPa
33770 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ge){.  return sq
33780 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
33790 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a  efcount(pPage);.
337a0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
337b0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  _TEST./*.** This
337c0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
337d0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
337e0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
337f0 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50  */.int *sqlite3P
33800 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20  agerStats(Pager 
33810 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
33820 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
33830 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[0] = sqlite3Pc
33840 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
33850 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
33860 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[1] = sqlite3P
33870 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
33880 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
33890 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65  .  a[2] = sqlite
338a0 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73  3PcacheGetCaches
338b0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
338c0 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  che);.  a[3] = p
338d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
338e0 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65  id ? (int) pPage
338f0 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a  r->dbSize : -1;.
33900 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
33910 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
33920 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33930 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
33940 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
33950 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
33960 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
33970 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
33980 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
33990 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
339a0 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
339b0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
339c0 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
339d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
339e0 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  n true if this i
339f0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
33a00 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
33a10 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62  ite3PagerIsMemdb
33a20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33a30 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b  .  return MEMDB;
33a40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
33a50 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61  that there are a
33a60 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69  t least nSavepoi
33a70 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70  nt savepoints op
33a80 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  en. If there are
33a90 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65  .** currently le
33aa0 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69  ss than nSavepoi
33ab0 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f  nts open, then o
33ac0 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  pen one or more 
33ad0 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  savepoints.** to
33ae0 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66   make up the dif
33af0 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20  ference. If the 
33b00 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
33b10 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a  ints is already.
33b20 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76  ** equal to nSav
33b30 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69  epoint, then thi
33b40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
33b50 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
33b60 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
33b70 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  ion fails, SQLIT
33b80 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
33b90 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
33ba0 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
33bb0 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75  e opening the su
33bc0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
33bd0 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72  then an IO error
33be0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75   code is.** retu
33bf0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
33c00 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
33c10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
33c20 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67  penSavepoint(Pag
33c30 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
33c40 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  nSavepoint){.  i
33c50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
33c60 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
33c70 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
33c80 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
33c90 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67   nCurrent = pPag
33ca0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
33cb0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
33cc0 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  t number of save
33cd0 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28  points */..  if(
33ce0 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72   nSavepoint>nCur
33cf0 72 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rent && pPager->
33d00 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
33d10 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
33d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
33d40 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
33d50 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  /.    PagerSavep
33d60 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20  oint *aNew;     
33d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33d80 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65   New Pager.aSave
33d90 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 20  point array */. 
33da0 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
33db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
33dd0 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  ze of database f
33de0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
33df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
33e00 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
33e10 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
33e20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
33e30 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
33e40 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
33e50 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
33e60 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
33e70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
33e80 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
33e90 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
33ea0 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
33eb0 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
33ec0 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
33ed0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
33ee0 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
33ef0 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
33f00 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
33f10 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
33f20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
33f30 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
33f40 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
33f50 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
33f60 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
33f70 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
33f80 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
33f90 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
33fa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33fb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
33fc0 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
33fd0 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
33fe0 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
33ff0 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
34000 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
34010 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
34020 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 0a  epoint = aNew;..
34030 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
34040 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
34050 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
34060 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
34070 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72  .    for(ii=nCur
34080 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f  rent; ii<nSavepo
34090 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
340a0 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67    aNew[ii].nOrig
340b0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
340c0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
340d0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
340e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
340f0 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  ){.        aNew[
34100 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50  ii].iOffset = pP
34110 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34120 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34130 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
34140 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41  iOffset = JOURNA
34150 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
34160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34170 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63  aNew[ii].iSubRec
34180 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
34190 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69  ec;.      aNew[i
341a0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
341b0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
341c0 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20  reate(nPage);.  
341d0 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69      if( !aNew[ii
341e0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29  ].pInSavepoint )
341f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
34200 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34220 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
34230 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
34240 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
34250 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  int(pPager->pWal
34260 2c 20 61 4e 65 77 5b 69 69 5d 2e 61 57 61 6c 44  , aNew[ii].aWalD
34270 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ata);.      }.  
34280 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
34290 65 70 6f 69 6e 74 20 3d 20 69 69 2b 31 3b 0a 20  epoint = ii+1;. 
342a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
342b0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
342c0 69 6e 74 3d 3d 6e 53 61 76 65 70 6f 69 6e 74 20  int==nSavepoint 
342d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75  );.    assertTru
342e0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
342f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
34300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
34310 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
34320 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
34330 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
34340 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61  se (commit) a sa
34350 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20  vepoint..** The 
34360 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c  savepoint to rel
34370 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
34380 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65   need not be the
34390 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a   most recently .
343a0 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ** created savep
343b0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  oint..**.** Para
343c0 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61  meter op is alwa
343d0 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  ys either SAVEPO
343e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  INT_ROLLBACK or 
343f0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34400 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53  E..** If it is S
34410 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
34420 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61  , then release a
34430 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73  nd destroy the s
34440 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a  avepoint with.**
34450 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e   index iSavepoin
34460 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  t. If it is SAVE
34470 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
34480 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c  then rollback al
34490 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61  l changes.** tha
344a0 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
344b0 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
344c0 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
344d0 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
344e0 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
344f0 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
34500 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
34510 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
34520 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
34530 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
34540 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
34550 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
34560 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
34570 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
34580 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
34590 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
345a0 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
345b0 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
345c0 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
345d0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
345e0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
345f0 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
34600 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
34610 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
34620 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
34630 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
34640 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
34650 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
34660 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
34670 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
34680 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
34690 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
346a0 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
346b0 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
346c0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
346d0 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
346e0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
346f0 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
34700 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
34710 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
34720 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
34730 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
34740 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
34750 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
34760 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
34770 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
34780 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
34790 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
347a0 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
347b0 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
347c0 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
347d0 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
347e0 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
347f0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
34800 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
34810 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
34820 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
34830 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
34840 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
34850 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
34860 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
34870 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
34880 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
34890 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
348a0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
348b0 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
348c0 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
348d0 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
348e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
348f0 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
34900 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
34910 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
34920 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
34930 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
34940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34950 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
34960 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
34970 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
34980 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
34990 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
349a0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
349b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
349c0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
349d0 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
349e0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
349f0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
34a00 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
34a10 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
34a20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
34a30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34a40 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
34a50 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
34a60 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
34a70 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
34a80 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
34a90 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
34aa0 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
34ab0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
34ac0 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
34ad0 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
34ae0 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
34af0 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
34b00 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
34b10 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
34b20 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
34b30 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
34b40 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
34b50 76 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d  vepoint + (( op=
34b60 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
34b70 53 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20  SE ) ? 0 : 1);. 
34b80 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20     for(ii=nNew; 
34b90 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
34ba0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
34bb0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
34bc0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
34bd0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
34be0 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
34bf0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
34c00 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e  >nSavepoint = nN
34c10 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ew;..    /* If t
34c20 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
34c30 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
34c40 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75  t savepoint, tru
34c50 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  ncate .    ** th
34c60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f  e sub-journal to
34c70 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
34c80 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ize. */.    if( 
34c90 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
34ca0 4c 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69  LEASE ){.      i
34cb0 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73  f( nNew==0 && is
34cc0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
34cd0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  d) ){.        /*
34ce0 20 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69   Only truncate i
34cf0 66 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65  f it is an in-me
34d00 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
34d10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
34d20 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
34d30 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
34d40 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
34d50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
34d60 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
34d70 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
34d80 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
34d90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
34da0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
34db0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
34dc0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
34dd0 0a 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69  .    /* Else thi
34de0 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
34df0 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62  operation, playb
34e00 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65  ack the specifie
34e10 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20  d savepoint..   
34e20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
34e30 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69   temp-file, it i
34e40 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
34e50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
34e60 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
34e70 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
34e80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34e90 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
34ea0 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20   changes to.    
34eb0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
34ec0 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61  file, so the pla
34ed0 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
34ee0 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
34ef0 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20      */.    else 
34f00 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
34f10 70 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65  pPager) || isOpe
34f20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
34f30 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76  {.      PagerSav
34f40 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
34f50 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30  nt = (nNew==0)?0
34f60 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  :&pPager->aSavep
34f70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20  oint[nNew-1];.  
34f80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c      rc = pagerPl
34f90 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
34fa0 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69  pPager, pSavepoi
34fb0 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nt);.      asser
34fc0 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  t(rc!=SQLITE_DON
34fd0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d  E);.    }.  .  }
34fe0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
34ff0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
35000 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
35010 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
35020 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
35030 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
35040 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
35050 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
35060 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
35070 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
35080 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74  eturn the VFS st
35090 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
350a0 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  pager..*/.const 
350b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
350c0 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67  ite3PagerVfs(Pag
350d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
350e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56  eturn pPager->pV
350f0 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fs;.}../*.** Ret
35100 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e  urn the file han
35110 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  dle for the data
35120 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
35130 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
35140 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69   pager.  This mi
35150 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ght return NULL 
35160 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a  if the file has.
35170 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
35180 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  opened..*/.sqlit
35190 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33  e3_file *sqlite3
351a0 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20  PagerFile(Pager 
351b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
351c0 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d  rn pPager->fd;.}
351d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
351e0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
351f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
35200 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
35210 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
35220 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67  rJournalname(Pag
35230 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
35240 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a  eturn pPager->zJ
35250 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ournal;.}../*.**
35260 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
35270 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72  fsync() calls ar
35280 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74  e disabled for t
35290 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75  his pager.  Retu
352a0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66  rn FALSE.** if f
352b0 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63  sync()s are exec
352c0 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a  uted normally..*
352d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
352e0 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  erNosync(Pager *
352f0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
35300 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
35310 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
35320 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
35330 2a 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65  ** Set or retrie
35340 76 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  ve the codec for
35350 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73   this pager.*/.s
35360 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
35370 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
35380 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
35390 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
353a0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
353b0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
353c0 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
353d0 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
353e0 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  t),.  void (*xCo
353f0 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c  decFree)(void*),
35400 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a  .  void *pCodec.
35410 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
35420 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
35430 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
35440 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
35450 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
35460 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ec = pPager->mem
35470 44 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b  Db ? 0 : xCodec;
35480 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
35490 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64  cSizeChng = xCod
354a0 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50  ecSizeChng;.  pP
354b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
354c0 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20   = xCodecFree;. 
354d0 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20   pPager->pCodec 
354e0 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65  = pCodec;.  page
354f0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
35500 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  er);.}.static vo
35510 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
35520 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a  GetCodec(Pager *
35530 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
35540 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  n pPager->pCodec
35550 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
35560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35570 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
35580 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
35590 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
355a0 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
355b0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
355c0 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
355d0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
355e0 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
355f0 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
35600 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
35610 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
35620 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
35630 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
35640 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
35650 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
35660 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
35670 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
35680 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
35690 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
356a0 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
356b0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
356c0 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
356d0 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
356e0 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
356f0 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
35700 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
35710 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
35720 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
35730 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
35740 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
35750 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
35760 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
35770 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
35780 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
35790 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
357a0 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
357b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
357c0 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
357d0 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
357e0 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
357f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
35800 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
35810 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
35820 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
35830 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
35840 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
35850 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
35860 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
35870 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
35880 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
35890 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
358a0 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
358b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
358c0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
358d0 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
358e0 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
358f0 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
35900 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
35910 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
35920 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
35930 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
35940 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
35950 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
35960 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
35970 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
35980 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
35990 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
359a0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
359b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  on..**.** This f
359c0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
359d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
359e0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
359f0 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
35a00 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72  ** occurs. Other
35a10 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73  wise, it returns
35a20 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
35a30 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
35a40 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
35a50 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
35a60 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69  Pg, Pgno pgno, i
35a70 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20  nt isCommit){.  
35a80 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
35a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35aa0 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
35ab0 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
35ac0 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
35ad0 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  no = 0;       /*
35ae0 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50   Old value of pP
35af0 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63  g->pgno, if sync
35b00 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   is required */.
35b10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
35b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35b30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
35b40 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f  .  Pgno origPgno
35b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35b60 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
35b70 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  page number */..
35b80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
35b90 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  Ref>0 );..  /* I
35ba0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62  n order to be ab
35bb0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
35bc0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
35bd0 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e  abase must journ
35be0 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  al.  ** the page
35bf0 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66   we are moving f
35c00 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rom..  */.  if( 
35c10 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20  MEMDB ){.    rc 
35c20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
35c30 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ite(pPg);.    if
35c40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
35c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
35c60 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f  he page being mo
35c70 76 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64  ved is dirty and
35c80 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61   has not been sa
35c90 76 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73  ved by the lates
35ca0 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74  t.  ** savepoint
35cb0 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20  , then save the 
35cc0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
35cd0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74   of the page int
35ce0 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d  o the .  ** sub-
35cf0 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69  journal now. Thi
35d00 73 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  s is required to
35d10 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c   handle the foll
35d20 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
35d30 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49    **.  **   BEGI
35d40 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  N;.  **     <jou
35d50 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65  rnal page X, the
35d60 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d  n modify it in m
35d70 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20  emory>.  **     
35d80 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20  SAVEPOINT one;. 
35d90 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20   **       <Move 
35da0 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69  page X to locati
35db0 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52  on Y>.  **     R
35dc0 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a  OLLBACK TO one;.
35dd0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67    **.  ** If pag
35de0 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69  e X were not wri
35df0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
35e00 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74  journal here, it
35e10 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20   would not.  ** 
35e20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72  be possible to r
35e30 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65  estore its conte
35e40 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f  nts when the "RO
35e50 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20  LLBACK TO one". 
35e60 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
35e70 72 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e  re is processed.
35e80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f  .  **.  ** subjo
35e90 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20  urnalPage() may 
35ea0 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  need to allocate
35eb0 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   space to store 
35ec0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20  pPg->pgno into. 
35ed0 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   ** one or more 
35ee0 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  savepoint bitvec
35ef0 73 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72  s. This is the r
35f00 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74  eason this funct
35f10 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74  ion.  ** may ret
35f20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
35f30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
35f40 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
35f50 52 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65  RTY.   && subjRe
35f60 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
35f70 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
35f80 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61  =(rc = subjourna
35f90 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b  lPage(pPg)).  ){
35fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
35fb0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
35fc0 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E(("MOVE %d page
35fd0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
35fe0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
35ff0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
36000 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
36010 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73  gno, (pPg->flags
36020 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
36030 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20  )?1:0, pgno));. 
36040 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20   IOTRACE(("MOVE 
36050 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61  %p %d %d\n", pPa
36060 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
36070 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20  pgno))..  /* If 
36080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
36090 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
360a0 20 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67   before page pPg
360b0 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20  ->pgno can.  ** 
360c0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73  be written to, s
360d0 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
360e0 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
360f0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
36100 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
36110 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  isCommit flag is
36120 20 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e   set, there is n
36130 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
36140 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  er that.  ** the
36150 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
36160 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
36170 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
36180 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20  ge pPg->pgno .  
36190 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
361a0 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
361b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
361c0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
361d0 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20  te to it..  */. 
361e0 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
361f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
36200 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29  ) && !isCommit )
36210 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
36220 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
36230 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
36240 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c  InJournal(pPg) |
36250 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
36260 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
36270 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
36280 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
36290 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65  IRTY );.    asse
362a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
362b0 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
362c0 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63  * If the cache c
362d0 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77  ontains a page w
362e0 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ith page-number 
362f0 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a  pgno, remove it.
36300 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61    ** from its ha
36310 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
36320 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
36330 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
36340 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
36350 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
36360 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
36370 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
36380 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
36390 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
363a0 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
363b0 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
363c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
363d0 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
363e0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
363f0 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  no);.  assert( !
36400 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64  pPgOld || pPgOld
36410 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69  ->nRef==1 );.  i
36420 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
36430 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28   pPg->flags |= (
36440 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47  pPgOld->flags&PG
36450 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a  HDR_NEED_SYNC);.
36460 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
36470 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
36480 20 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66   discard pages f
36490 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  rom an in-memory
364a0 20 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20   database since 
364b0 77 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a  we might.      *
364c0 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  * need to rollba
364d0 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20  ck later.  Just 
364e0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75  move the page ou
364f0 74 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f  t of the way. */
36500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
36510 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
36520 69 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  id );.      sqli
36530 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
36540 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62  gOld, pPager->db
36550 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c  Size+1);.    }el
36560 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
36570 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f  3PcacheDrop(pPgO
36580 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ld);.    }.  }..
36590 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67    origPgno = pPg
365a0 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65  ->pgno;.  sqlite
365b0 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
365c0 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65   pgno);.  sqlite
365d0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
365e0 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
365f0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
36600 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
36610 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
36620 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
36630 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
36640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36650 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
36660 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
36670 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
36680 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
36690 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
366a0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
366b0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
366c0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
366d0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
366e0 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
366f0 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
36700 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
36710 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
36720 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
36730 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
36740 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
36750 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
36760 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
36770 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
36780 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
36790 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
367a0 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
367b0 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
367c0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
367d0 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
367e0 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
367f0 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
36800 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
36810 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
36820 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
36830 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
36840 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
36850 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
36860 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
36870 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
36880 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
36890 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
368a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
368b0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
368c0 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
368d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
368e0 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
368f0 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
36900 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
36910 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
36920 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
36930 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
36940 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
36950 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
36960 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
36970 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
36980 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
36990 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
369a0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
369b0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
369c0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
369d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
369e0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
369f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36a00 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
36a10 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
36a20 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
36a30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36a40 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
36a50 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
36a60 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
36a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36a80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
36a90 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  e!=0 );.        
36aa0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65  sqlite3BitvecCle
36ab0 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ar(pPager->pInJo
36ac0 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50  urnal, needSyncP
36ad0 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d  gno, pPager->pTm
36ae0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d  pSpace);.      }
36af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
36b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
36b10 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
36b20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
36b30 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
36b40 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  && !MEMDB );.   
36b50 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
36b60 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
36b70 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  C;.    sqlite3Pc
36b80 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
36b90 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
36ba0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
36bb0 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  Hdr);.  }..  /*.
36bc0 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d    ** For an in-m
36bd0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
36be0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72  make sure the or
36bf0 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
36c00 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78  inues.  ** to ex
36c10 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ist, in case the
36c20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
36c30 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e  ds to roll back.
36c40 20 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a    Use pPgOld.  *
36c50 2a 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61  * as the origina
36c60 6c 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20  l page since it 
36c70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
36c80 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f   allocated..  */
36c90 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
36ca0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
36cb0 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72  eMove(pPgOld, or
36cc0 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c  igPgno);.    sql
36cd0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
36ce0 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72  PgOld);.  }..  r
36cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36d00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
36d10 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
36d20 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f  r to the data fo
36d30 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
36d40 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
36d50 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
36d60 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ta(DbPage *pPg){
36d70 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
36d80 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70  nRef>0 || pPg->p
36d90 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a  Pager->memDb );.
36da0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44    return pPg->pD
36db0 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ata;.}../*.** Re
36dc0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
36dd0 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
36de0 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
36df0 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
36e00 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
36e10 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
36e20 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
36e30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
36e40 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
36e50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
36e60 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pExtra;.}../*.*
36e70 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
36e80 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
36e90 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
36ea0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
36eb0 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
36ec0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
36ed0 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
36ee0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
36ef0 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
36f00 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
36f10 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
36f20 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
36f30 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
36f40 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
36f50 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
36f60 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
36f70 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
36f80 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
36f90 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
36fa0 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
36fb0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
36fc0 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
36fd0 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
36fe0 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
36ff0 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
37000 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
37010 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
37020 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
37030 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
37040 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
37050 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
37060 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
37070 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
37080 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
37090 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20  NORMAL.         
370a0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
370b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
370c0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
370d0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
370e0 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  INGMODE_QUERY<0 
370f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
37100 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
37110 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45  ORMAL>=0 && PAGE
37120 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
37130 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20  CLUSIVE>=0 );.  
37140 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20  if( eMode>=0 && 
37150 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
37160 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
37170 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
37180 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a   (u8)eMode;.  }.
37190 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
371a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
371b0 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ode;.}../*.** Se
371c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
371d0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
371e0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
371f0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  de must be one o
37200 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45  f:.**.**    PAGE
37210 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
37220 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
37230 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
37240 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
37250 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
37260 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
37270 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
37280 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  F.**    PAGER_JO
37290 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
372a0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
372b0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a  RNALMODE_WAL.**.
372c0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f  ** The journalmo
372d0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
372e0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
372f0 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69   if the change i
37300 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 54 68  s allowed..** Th
37310 65 20 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20  e change may be 
37320 64 69 73 61 6c 6c 6f 77 65 64 20 66 6f 72 20 74  disallowed for t
37330 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61  he following rea
37340 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  sons:.**.**   * 
37350 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   An in-memory da
37360 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20  tabase can only 
37370 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  have its journal
37380 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46  _mode set to _OF
37390 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45  F.**      or _ME
373a0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  MORY..**.**   * 
373b0 20 54 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   Temporary datab
373c0 61 73 65 73 20 63 61 6e 6e 6f 74 20 68 61 76 65  ases cannot have
373d0 20 5f 57 41 4c 20 6a 6f 75 72 6e 61 6c 6d 6f 64   _WAL journalmod
373e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  e..**.** The ret
373f0 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
37400 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
37410 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
37420 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
37430 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
37440 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  etJournalMode(Pa
37450 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
37460 20 65 4d 6f 64 65 29 7b 0a 20 20 75 38 20 65 4f   eMode){.  u8 eO
37470 6c 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ld = pPager->jou
37480 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 2f 2a 20  rnalMode;    /* 
37490 50 72 69 6f 72 20 6a 6f 75 72 6e 61 6c 6d 6f 64  Prior journalmod
374a0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 65  e */..  /* The e
374b0 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
374c0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 2a  s always valid *
374d0 2f 0a 20 20 61 73 73 65 72 74 28 20 20 20 20 20  /.  assert(     
374e0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
374f0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
37500 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37510 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37520 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
37530 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
37540 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
37550 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
37560 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  T.            ||
37570 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
37580 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
37590 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
375a0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
375b0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
375c0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
375d0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
375e0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20  ODE_MEMORY );.. 
375f0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
37600 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65   the journalmode
37610 20 6f 66 20 61 20 54 45 4d 50 20 64 61 74 61 62   of a TEMP datab
37620 61 73 65 20 74 6f 20 62 65 20 63 68 61 6e 67 65  ase to be change
37630 64 20 74 6f 20 57 41 4c 0a 20 20 2a 2f 0a 20 20  d to WAL.  */.  
37640 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
37650 46 69 6c 65 20 26 26 20 65 4d 6f 64 65 3d 3d 50  File && eMode==P
37660 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37670 5f 57 41 4c 20 29 7b 0a 20 20 20 20 61 73 73 65  _WAL ){.    asse
37680 72 74 28 20 65 4f 6c 64 21 3d 50 41 47 45 52 5f  rt( eOld!=PAGER_
37690 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
376a0 29 3b 0a 20 20 20 20 65 4d 6f 64 65 20 3d 20 65  );.    eMode = e
376b0 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  Old;.  }..  /* D
376c0 6f 20 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72  o allow the jour
376d0 6e 61 6c 6d 6f 64 65 20 6f 66 20 61 6e 20 69 6e  nalmode of an in
376e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
376f0 20 74 6f 20 62 65 20 73 65 74 20 74 6f 0a 20 20   to be set to.  
37700 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65  ** anything othe
37710 72 20 74 68 61 6e 20 4d 45 4d 4f 52 59 20 6f 72  r than MEMORY or
37720 20 4f 46 46 0a 20 20 2a 2f 0a 20 20 69 66 28 20   OFF.  */.  if( 
37730 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
37740 65 72 74 28 20 65 4f 6c 64 3d 3d 50 41 47 45 52  ert( eOld==PAGER
37750 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
37760 4f 52 59 20 7c 7c 20 65 4f 6c 64 3d 3d 50 41 47  ORY || eOld==PAG
37770 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
37780 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  FF );.    if( eM
37790 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
377a0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 26  ALMODE_MEMORY &&
377b0 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f   eMode!=PAGER_JO
377c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
377d0 0a 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 65  .      eMode = e
377e0 4f 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Old;.    }.  }..
377f0 20 20 69 66 28 20 65 4d 6f 64 65 21 3d 65 4f 6c    if( eMode!=eOl
37800 64 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  d ){.    /* When
37810 20 63 68 61 6e 67 69 6e 67 20 62 65 74 77 65 65   changing betwee
37820 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 73  n rollback modes
37830 2c 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  , close the jour
37840 6e 61 6c 20 66 69 6c 65 20 70 72 69 6f 72 0a 20  nal file prior. 
37850 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 68 61     ** to the cha
37860 6e 67 65 2e 20 20 42 75 74 20 77 68 65 6e 20 63  nge.  But when c
37870 68 61 6e 67 69 6e 67 20 66 72 6f 6d 20 61 20 72  hanging from a r
37880 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 6f 20  ollback mode to 
37890 57 41 4c 2c 20 6b 65 65 70 0a 20 20 20 20 2a 2a  WAL, keep.    **
378a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 70 65   the journal ope
378b0 6e 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  n since there is
378c0 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 73 74 79 6c   a rollback-styl
378d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
378e0 20 70 6c 61 79 0a 20 20 20 20 2a 2a 20 75 73 65   play.    ** use
378f0 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65  d to convert the
37900 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73   version numbers
37910 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 68 65   in the btree he
37920 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
37930 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
37940 65 72 2d 3e 6a 66 64 29 20 26 26 20 65 4d 6f 64  er->jfd) && eMod
37950 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
37960 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
37970 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
37980 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
37990 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 61     }..    /* Cha
379a0 6e 67 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nge the journal 
379b0 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  mode. */.    pPa
379c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
379d0 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 0a 20   = (u8)eMode;.. 
379e0 20 20 20 2f 2a 20 57 68 65 6e 20 74 72 61 6e 73     /* When trans
379f0 69 73 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 54  istioning from T
37a00 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49  RUNCATE or PERSI
37a10 53 54 20 74 6f 20 61 6e 79 20 6f 74 68 65 72 20  ST to any other 
37a20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d  journal.    ** m
37a30 6f 64 65 20 65 78 63 65 70 74 20 57 41 4c 20 28  ode except WAL (
37a40 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
37a50 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
37a60 58 43 4c 55 53 49 56 45 29 20 74 68 65 6e 20 0a  XCLUSIVE) then .
37a70 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68      ** delete th
37a80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
37a90 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
37aa0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
37ab0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26  LMODE_TRUNCATE &
37ac0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)==1 );.    as
37ad0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
37ae0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
37af0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
37b00 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
37b10 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
37b20 45 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20  E & 5)==0 );.   
37b30 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
37b40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
37b50 52 59 20 26 20 35 29 3d 3d 34 20 29 3b 0a 20 20  RY & 5)==4 );.  
37b60 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
37b70 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37b80 20 26 20 35 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 5)==0 );.    
37b90 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
37ba0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 26  OURNALMODE_WAL &
37bb0 20 35 29 3d 3d 35 20 29 3b 0a 0a 20 20 20 20 61   5)==5 );..    a
37bc0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
37bd0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
37be0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
37bf0 64 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  de );.    if( !p
37c00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
37c10 4d 6f 64 65 20 26 26 20 28 65 4f 6c 64 20 26 20  Mode && (eOld & 
37c20 35 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20  5)==1 && (eMode 
37c30 26 20 31 29 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  & 1)==0 ){..    
37c40 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
37c50 65 20 77 65 20 77 6f 75 6c 64 20 6c 69 6b 65 20  e we would like 
37c60 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
37c70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 69  urnal file. If i
37c80 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  t is.      ** no
37c90 74 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 6e  t possible, then
37ca0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
37cb0 72 6f 62 6c 65 6d 2e 20 44 65 6c 65 74 69 6e 67  roblem. Deleting
37cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37cd0 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 72 65 20  e.      ** here 
37ce0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
37cf0 6f 6e 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  on only..      *
37d00 2a 0a 20 20 20 20 20 20 2a 2a 20 42 65 66 6f 72  *.      ** Befor
37d10 65 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  e deleting the j
37d20 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 62 74  ournal file, obt
37d30 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
37d40 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
37d50 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
37d60 65 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  e. This ensures 
37d70 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
37d80 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c   file is not del
37d90 65 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 68  eted.      ** wh
37da0 69 6c 65 20 69 74 20 69 73 20 69 6e 20 75 73 65  ile it is in use
37db0 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   by some other c
37dc0 6c 69 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  lient..      */.
37dd0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
37de0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
37df0 69 6e 74 20 73 74 61 74 65 20 3d 20 70 50 61 67  int state = pPag
37e00 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 20 20 20  er->state;.     
37e10 20 69 66 28 20 73 74 61 74 65 3c 50 41 47 45 52   if( state<PAGER
37e20 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
37e30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37e40 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
37e50 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
37e60 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
37e70 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
37e80 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20 20  HARED ){.       
37e90 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
37ea0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
37eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37ec0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
37ed0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
37ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37ef0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37f00 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
37f10 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
37f20 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
37f30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
37f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
37f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37f60 26 26 20 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  && state==PAGER_
37f70 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20 20  SHARED ){.      
37f80 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
37f90 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
37fa0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
37fb0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 61 74    }else if( stat
37fc0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
37fd0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
37fe0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
37ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
38000 73 73 65 72 74 28 20 73 74 61 74 65 3d 3d 70 50  ssert( state==pP
38010 61 67 65 72 2d 3e 73 74 61 74 65 20 29 3b 0a 20  ager->state );. 
38020 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
38030 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6a 6f  eturn the new jo
38040 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 20 20  urnal mode */.  
38050 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
38060 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b  er->journalMode;
38070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
38080 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
38090 72 6e 61 6c 20 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal mode..*/.in
380a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  t sqlite3PagerGe
380b0 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  tJournalMode(Pag
380c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
380d0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
380e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
380f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
38100 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
38110 72 20 69 73 20 69 6e 20 61 20 73 74 61 74 65 20  r is in a state 
38120 77 68 65 72 65 20 69 74 20 69 73 20 4f 4b 20 74  where it is OK t
38130 6f 20 63 68 61 6e 67 65 20 74 68 65 0a 2a 2a 20  o change the.** 
38140 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e 20 20 4a 6f  journalmode.  Jo
38150 75 72 6e 61 6c 6d 6f 64 65 20 63 68 61 6e 67 65  urnalmode change
38160 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
38170 6e 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  n when the datab
38180 61 73 65 0a 2a 2a 20 69 73 20 75 6e 6d 6f 64 69  ase.** is unmodi
38190 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
381a0 69 74 65 33 50 61 67 65 72 4f 6b 54 6f 43 68 61  ite3PagerOkToCha
381b0 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  ngeJournalMode(P
381c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
381d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
381e0 6f 64 69 66 69 65 64 20 29 20 72 65 74 75 72 6e  odified ) return
381f0 20 30 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   0;.  if( isOpen
38200 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
38210 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38220 4f 66 66 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Off>0 ) return 0
38230 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
38240 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
38250 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
38260 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
38270 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
38280 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74  .**.** Setting t
38290 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f  he size limit to
382a0 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d   -1 means no lim
382b0 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a  it is enforced..
382c0 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f  ** An attempt to
382d0 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61   set a limit sma
382e0 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20  ller than -1 is 
382f0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20  a no-op..*/.i64 
38300 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
38310 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
38320 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
38330 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
38340 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
38350 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38360 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
38370 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
38380 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
38390 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
383a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
383b0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
383c0 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
383d0 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
383e0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
383f0 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
38400 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
38410 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
38420 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
38430 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
38440 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
38450 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
38460 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
38470 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
38480 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
38490 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
384a0 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
384b0 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
384c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
384d0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
384e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
384f0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
38500 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
38510 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
38520 65 20 75 73 65 72 20 69 6e 76 6f 6b 65 73 20 22  e user invokes "
38530 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
38540 74 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t"..*/.int sqlit
38550 65 33 50 61 67 65 72 43 68 65 63 6b 70 6f 69 6e  e3PagerCheckpoin
38560 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
38570 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
38580 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
38590 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 20 20  ager->pWal ){.  
385a0 20 20 75 38 20 2a 7a 42 75 66 20 3d 20 28 75 38    u8 *zBuf = (u8
385b0 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
385c0 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  pace;.    rc = s
385d0 71 6c 69 74 65 33 57 61 6c 43 68 65 63 6b 70 6f  qlite3WalCheckpo
385e0 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  int(pPager->pWal
385f0 2c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  ,.        (pPage
38600 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20  r->noSync ? 0 : 
38610 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
38620 67 73 29 2c 0a 20 20 20 20 20 20 20 20 70 50 61  gs),.        pPa
38630 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 7a  ger->pageSize, z
38640 42 75 66 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  Buf.    );.  }. 
38650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
38660 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
38670 61 6c 43 61 6c 6c 62 61 63 6b 28 50 61 67 65 72  alCallback(Pager
38680 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
38690 75 72 6e 20 73 71 6c 69 74 65 33 57 61 6c 43 61  urn sqlite3WalCa
386a0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 2d 3e 70  llback(pPager->p
386b0 57 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Wal);.}../*.** R
386c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
386d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 56 46 53  e underlying VFS
386e0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
386f0 61 67 65 72 20 73 75 70 70 6f 72 74 73 20 74 68  ager su