/ Hex Artifact Content
Login

Artifact 434f9751fc2dfc11ade004282deda5f8560bcba2:


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 69 46 72 61 6d 65 3b 20 20 20    u32 iFrame;   
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2670: 2a 20 4c 61 73 74 20 66 72 61 6d 65 20 69 6e 20  * Last frame in 
2680: 57 41 4c 20 77 68 65 6e 20 73 61 76 65 70 6f 69  WAL when savepoi
2690: 6e 74 20 6f 70 65 6e 65 64 20 2a 2f 0a 7d 3b 0a  nt opened */.};.
26a0: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
26b0: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
26c0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
26d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
26e0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64  re..**.** errCod
26f0: 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  e.**.**   Pager.
2700: 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73  errCode may be s
2710: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45  et to SQLITE_IOE
2720: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
2730: 50 54 2c 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53  PT, or.**   or S
2740: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2750: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2760: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2770: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2780: 74 73 0a 2a 2a 20 20 20 61 6e 64 20 69 73 20 72  ts.**   and is r
2790: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
27a0: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
27b0: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
27c0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53  all.  The.**   S
27d0: 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72  QLITE_FULL retur
27e0: 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74  n code is slight
27f0: 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74  ly different. It
2800: 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75   persists only u
2810: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65  ntil the.**   ne
2820: 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f  xt successful ro
2830: 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72  llback is perfor
2840: 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72  med on the pager
2850: 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a   cache. Also,.**
2860: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64     SQLITE_FULL d
2870: 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
2880: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2890: 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
28a0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  PagerLookup().**
28b0: 20 20 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61     APIs, they ma
28c0: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
28d0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a  successfully..**
28e0: 0a 2a 2a 20 64 62 53 69 7a 65 56 61 6c 69 64 2c  .** dbSizeValid,
28f0: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2900: 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a  ize, dbFileSize.
2910: 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67  **.**   Managing
2920: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
2930: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2940: 6e 20 70 61 67 65 73 20 69 73 20 61 20 6c 69 74  n pages is a lit
2950: 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  tle complicated.
2960: 0a 2a 2a 20 20 20 54 68 65 20 76 61 72 69 61 62  .**   The variab
2970: 6c 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  le Pager.dbSize 
2980: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2990: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
29a0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  t the database.*
29b0: 2a 20 20 20 69 6d 61 67 65 20 63 75 72 72 65 6e  *   image curren
29c0: 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73  tly contains. As
29d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
29e0: 61 67 65 20 67 72 6f 77 73 20 6f 72 20 73 68 72  age grows or shr
29f0: 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20 20 20 76  inks this.**   v
2a00: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
2a10: 65 64 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  ed. The variable
2a20: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
2a30: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
2a40: 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61  umber.**   of pa
2a50: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
2a60: 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 6d  ase file. This m
2a70: 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
2a80: 66 72 6f 6d 20 50 61 67 65 72 2e 64 62 53 69 7a  from Pager.dbSiz
2a90: 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d 65 20 70  e.**   if some p
2aa0: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 61  ages have been a
2ab0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
2ac0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 62 75  atabase image bu
2ad0: 74 20 6e 6f 74 20 79 65 74 20 77 72 69 74 74 65  t not yet writte
2ae0: 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20  n.**   out from 
2af0: 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
2b00: 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20   actual file on 
2b10: 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68 65 20  disk. Or if the 
2b20: 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e 0a 2a  image has been.*
2b30: 2a 20 20 20 74 72 75 6e 63 61 74 65 64 20 62 79  *   truncated by
2b40: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
2b50: 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
2b60: 2e 20 54 68 65 20 50 61 67 65 72 2e 64 62 4f 72  . The Pager.dbOr
2b70: 69 67 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  igSize variable.
2b80: 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73 20 74 68  **   contains th
2b90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
2ba0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
2bb0: 65 20 69 6d 61 67 65 20 77 68 65 6e 20 74 68 65  e image when the
2bc0: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72   current.**   tr
2bd0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
2be0: 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e  ened. The conten
2bf0: 74 73 20 6f 66 20 61 6c 6c 20 74 68 72 65 65 20  ts of all three 
2c00: 6f 66 20 74 68 65 73 65 20 76 61 72 69 61 62 6c  of these variabl
2c10: 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20  es is.**   only 
2c20: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2c30: 20 63 6f 72 72 65 63 74 20 69 66 20 74 68 65 20   correct if the 
2c40: 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72 2e 64 62  boolean Pager.db
2c50: 53 69 7a 65 56 61 6c 69 64 20 69 73 20 74 72 75  SizeValid is tru
2c60: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a  e..**.**   TODO:
2c70: 20 55 6e 64 65 72 20 77 68 61 74 20 63 6f 6e 64   Under what cond
2c80: 69 74 69 6f 6e 73 20 69 73 20 64 62 53 69 7a 65  itions is dbSize
2c90: 56 61 6c 69 64 20 73 65 74 3f 20 43 6c 65 61 72  Valid set? Clear
2ca0: 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65  ed?.**.** change
2cb0: 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20  CountDone.**.** 
2cc0: 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76    This boolean v
2cd0: 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
2ce0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
2cf0: 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  t the change-cou
2d00: 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20  nter .**   (the 
2d10: 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66 69  4-byte header fi
2d20: 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66 73  eld at byte offs
2d30: 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61 74  et 24 of the dat
2d40: 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a  abase file) is .
2d50: 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64  **   not updated
2d60: 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e   more often than
2d70: 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a   necessary. .**.
2d80: 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20 74  **   It is set t
2d90: 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65 20  o true when the 
2da0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
2db0: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
2dc0: 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e   which .**   can
2dd0: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2de0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2df0: 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  k is held on the
2e00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2e10: 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61 72  **   It is clear
2e20: 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65  ed (set to false
2e30: 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78  ) whenever an ex
2e40: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2e50: 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68  .**   relinquish
2e60: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
2e70: 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69  se file. Each ti
2e80: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
2e90: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a   is committed,.*
2ea0: 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f  *   The changeCo
2eb0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
2ec0: 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69 74  inspected. If it
2ed0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f   is true, the wo
2ee0: 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74  rk of.**   updat
2ef0: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f00: 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65  ounter is omitte
2f10: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
2f20: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  t transaction..*
2f30: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68  *.**   This mech
2f40: 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74  anism means that
2f50: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
2f60: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
2f70: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a   a connection .*
2f80: 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70  *   need only up
2f90: 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
2fa0: 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f  counter once, fo
2fb0: 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61 6e  r the first tran
2fc0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d  saction.**   com
2fd0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62  mitted..**.** db
2fe0: 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20  Modified.**.**  
2ff0: 20 54 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20   The dbModified 
3000: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
3010: 65 76 65 72 20 61 20 64 61 74 61 62 61 73 65 20  ever a database 
3020: 70 61 67 65 20 69 73 20 64 69 72 74 69 65 64 2e  page is dirtied.
3030: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
3040: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
3050: 66 20 65 61 63 68 20 74 72 61 6e 73 61 63 74 69  f each transacti
3060: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69  on..**.**   It i
3070: 73 20 75 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d  s used when comm
3080: 69 74 74 69 6e 67 20 6f 72 20 6f 74 68 65 72 77  itting or otherw
3090: 69 73 65 20 65 6e 64 69 6e 67 20 61 20 74 72 61  ise ending a tra
30a0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20  nsaction. If.** 
30b0: 20 20 74 68 65 20 64 62 4d 6f 64 69 66 69 65 64    the dbModified
30c0: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74   flag is clear t
30d0: 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b 20 68 61  hen less work ha
30e0: 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a  s to be done..**
30f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74  .** journalStart
3100: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ed.**.**   This 
3110: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
3120: 65 76 65 72 20 74 68 65 20 74 68 65 20 6d 61 69  ever the the mai
3130: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
3140: 6e 65 64 20 61 6e 64 0a 2a 2a 20 20 20 69 6e 69  ned and.**   ini
3150: 74 69 61 6c 69 7a 65 64 0a 2a 2a 0a 2a 2a 20 20  tialized.**.**  
3160: 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68   The point of th
3170: 69 73 20 66 6c 61 67 20 69 73 20 74 68 61 74 20  is flag is that 
3180: 69 74 20 6d 75 73 74 20 62 65 20 73 65 74 20 61  it must be set a
3190: 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20 66  fter the .**   f
31a0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
31b0: 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61 6c  der in a journal
31c0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
31d0: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
31e0: 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20 68  *   After this h
31f0: 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65 77  as happened, new
3200: 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64 20   pages appended 
3210: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
3220: 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65 65  .**   do not nee
3230: 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  d the PGHDR_NEED
3240: 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c 20  _SYNC flag set, 
3250: 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6e  as they do not n
3260: 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69 74  eed.**   to wait
3270: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 73   for a journal s
3280: 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79 20  ync before they 
3290: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
32a0: 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 64  ut to.**   the d
32b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73 65  atabase file (se
32c0: 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72  e function pager
32d0: 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20 20  _write())..**   
32e0: 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a 2a  .** setMaster.**
32f0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
3300: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 65  ble is used to e
3310: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6d  nsure that the m
3320: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
3330: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69 66  le name.**   (if
3340: 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77 72   any) is only wr
3350: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
3360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63 65  ournal file once
3370: 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 63  ..**.**   When c
3380: 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
3390: 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61 73  saction, the mas
33a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
33b0: 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a 2a   name (if any).*
33c0: 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69 74 74  *   may be writt
33d0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
33e0: 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20 74  nal file while t
33f0: 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
3400: 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52 5f  l in.**   PAGER_
3410: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 20 28  RESERVED state (
3420: 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f  see CommitPhaseO
3430: 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61 63 74  ne() for the act
3440: 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74 68  ion). It.**   th
3450: 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  en attempts to u
3460: 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78 63  pgrade to an exc
3470: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66 20  lusive lock. If 
3480: 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a 20  this attempt.** 
3490: 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53 51    fails, then SQ
34a0: 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62 65  LITE_BUSY may be
34b0: 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
34c0: 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 75 73   user and the us
34d0: 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74 65  er.**   may atte
34e0: 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  mpt to commit th
34f0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 67  e transaction ag
3500: 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c 69  ain later (calli
3510: 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50 68  ng.**   CommitPh
3520: 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29 2e  aseOne() again).
3530: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 75 73   This flag is us
3540: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ed to ensure tha
3550: 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73 74  t the .**   mast
3560: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
3570: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3580: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
3590: 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ile the first.**
35a0: 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50 68     time CommitPh
35b0: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
35c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  ed..**.** doNotS
35d0: 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ync.**.**   When
35e0: 20 65 6e 61 62 6c 65 64 2c 20 63 61 63 68 65 20   enabled, cache 
35f0: 73 70 69 6c 6c 73 20 61 72 65 20 70 72 6f 68 69  spills are prohi
3600: 62 69 74 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  bited and the jo
3610: 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f  urnal file canno
3620: 74 0a 2a 2a 20 20 20 62 65 20 73 79 6e 63 65 64  t.**   be synced
3630: 2e 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65  .  This variable
3640: 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c 65 61   is set and clea
3650: 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61  red by sqlite3Pa
3660: 67 65 72 57 72 69 74 65 28 29 20 0a 2a 2a 20 20  gerWrite() .**  
3670: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
3680: 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73  vent a journal s
3690: 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69  ync from happeni
36a0: 6e 67 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ng in between th
36b0: 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 6c 69  e.**   journalli
36c0: 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20  ng of two pages 
36d0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  on the same sect
36e0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79  or..**.** needSy
36f0: 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a  nc.**.**   TODO:
3700: 20 49 74 20 6d 69 67 68 74 20 62 65 20 65 61 73   It might be eas
3710: 69 65 72 20 74 6f 20 73 65 74 20 74 68 69 73 20  ier to set this 
3720: 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72 69 74  variable in writ
3730: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a  eJournalHdr().**
3740: 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61 73 74     and writeMast
3750: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79  erJournal() only
3760: 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d 65 61  . Change its mea
3770: 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e 63 65  ning to "unsynce
3780: 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61 73 20  d data.**   has 
3790: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
37a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a  the journal"..**
37b0: 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  .** subjInMemory
37c0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73  .**.**   This is
37d0: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61   a boolean varia
37e0: 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68  ble. If true, th
37f0: 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  en any required 
3800: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
3810: 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   is opened as an
3820: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
3830: 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73  al file. If fals
3840: 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72  e, then in-memor
3850: 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e  y.**   sub-journ
3860: 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65  als are only use
3870: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
3880: 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a  pager files..*/.
3890: 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20  struct Pager {. 
38a0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
38b0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs;          /* 
38c0: 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  OS functions to 
38d0: 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20  use for IO */.  
38e0: 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  u8 exclusiveMode
38f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
3900: 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
3910: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58  locking_mode==EX
3920: 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20  CLUSIVE */.  u8 
3930: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20  journalMode;    
3940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f           /* On o
3950: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
3960: 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73  NALMODE_* values
3970: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
3980: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
3990: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
39a0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
39b0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
39c0: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
39e0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
39f0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
3a00: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
3a30: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
3a40: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
3a50: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3a60: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
3a70: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
3a80: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
3a90: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
3aa0: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
3ab0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
3ac0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
3ad0: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
3ae0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
3af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
3b00: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
3b10: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
3b20: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
3b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3b40: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
3b50: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
3b60: 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20   u8 memDb;      
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b80: 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20  True to inhibit 
3b90: 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a  all file I/O */.
3ba0: 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
3bb0: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
3bc0: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
3bd0: 65 6d 62 65 72 73 20 74 68 61 74 20 61 72 65 20  embers that are 
3be0: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
3bf0: 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67   modified during
3c00: 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
3c10: 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61  ns. The other va
3c20: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
3c30: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61  structure.  ** a
3c40: 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61  re either consta
3c50: 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68  nt throughout th
3c60: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68  e lifetime of th
3c70: 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65  e pager, or else
3c80: 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  .  ** used to st
3c90: 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ore configuratio
3ca0: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61  n parameters tha
3cb0: 74 20 61 66 66 65 63 74 20 74 68 65 20 77 61 79  t affect the way
3cc0: 20 74 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a   the pager .  **
3cd0: 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a   operates..  **.
3ce0: 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27    ** The 'state'
3cf0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 64 65 73   variable is des
3d00: 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64  cribed in more d
3d10: 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68  etail along with
3d20: 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69   the.  ** descri
3d30: 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61  ptions of the va
3d40: 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65  lues it may take
3d50: 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20   - PAGER_UNLOCK 
3d60: 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65  etc. Many of the
3d70: 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69  .  ** other vari
3d80: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c  ables in this bl
3d90: 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69 62 65  ock are describe
3da0: 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74  d in the comment
3db0: 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20   directly .  ** 
3dc0: 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73  above this class
3dd0: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a   definition..  *
3de0: 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20  /.  u8 state;   
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c  /* PAGER_UNLOCK,
3e10: 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52   _SHARED, _RESER
3e20: 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75  VED, etc. */.  u
3e30: 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20  8 dbModified;   
3e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3e50: 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ue if there are 
3e60: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74  any changes to t
3e70: 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65  he Db */.  u8 ne
3e80: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
3e90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3ea0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
3eb0: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
3ec0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f  urnal */.  u8 jo
3ed0: 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20  urnalStarted;   
3ee0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3ef0: 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72  f header of jour
3f00: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f  nal is synced */
3f10: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
3f20: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
3f30: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
3f40: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
3f50: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
3f60: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f80: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3f90: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3fa0: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3fb0: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fd0: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3fe0: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3ff0: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
4000: 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64 3b   u8 dbSizeValid;
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4020: 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65 20  Set when dbSize 
4030: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20  is correct */.  
4040: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
4050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4060: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
4070: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
4080: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
4090: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
40a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
40b0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
40c0: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
40d0: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
40e0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
40f0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
4100: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
4110: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
4120: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4130: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
4140: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
4150: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
4160: 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20  t errCode;      
4170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
4180: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
4190: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
41a0: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41c0: 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64  Pages journalled
41d0: 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65   since last j-he
41e0: 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ader written */.
41f0: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4210: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
4220: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
4230: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
4240: 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20   u32 nSubRec;   
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4260: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
4270: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62  s written to sub
4280: 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69  -journal */.  Bi
4290: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
42a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
42b0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
42c0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
42d0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c  se file */.  sql
42e0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
42f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4300: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
4310: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
4320: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
4330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
4340: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4350: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
4360: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4370: 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f  *sjfd;         /
4380: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4390: 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  r for sub-journa
43a0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
43b0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
43c0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
43d0: 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  ite offset in th
43e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
43f0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
4400: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
4410: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
4420: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
4430: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  al header */.  i
4440: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
4450: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
4460: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
4470: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
4480: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61 67 65 72  files */.  Pager
4490: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
44a0: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
44b0: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
44c0: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
44d0: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
44e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
44f0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
4500: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
4510: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
4520: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
4530: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
4540: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
4550: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20  hanges */.  u32 
4560: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
4570: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
4580: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
4590: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
45a0: 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b  /..  u16 nExtra;
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
45d0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
45e0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
45f0: 2f 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65  /.  i16 nReserve
4600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4610: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
4620: 73 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64  sed bytes at end
4630: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f   of each page */
4640: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4660: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
4670: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
4680: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
4690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
46a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
46b0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
46c0: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46e0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
46f0: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
4700: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
4710: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
4720: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4730: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
4740: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
4750: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
4760: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4770: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4780: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
4790: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
47a0: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
47b0: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
47c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
47d0: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
47e0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
47f0: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
4800: 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66  andler */.#ifdef
4810: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
4820: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
4830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
4840: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
4850: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
4860: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
4870: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4880: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
4890: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
48a0: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65   void (*xReinite
48b0: 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20  r)(DbPage*); /* 
48c0: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
48d0: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
48e0: 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66   pages */.#ifdef
48f0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4900: 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  C.  void *(*xCod
4910: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
4920: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
4930: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
4940: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
4950: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a  void (*xCodecSiz
4960: 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74  eChng)(void*,int
4970: 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79  ,int); /* Notify
4980: 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68   of page size ch
4990: 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  anges */.  void 
49a0: 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f  (*xCodecFree)(vo
49b0: 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20  id*);           
49c0: 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20    /* Destructor 
49d0: 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f  for the codec */
49e0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b  .  void *pCodec;
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4a00: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4a10: 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65   to xCodec... me
4a20: 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  thods */.#endif.
4a30: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
4a40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
4a50: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
4a60: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
4a70: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
4a80: 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b  PCache *pPCache;
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4aa0: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63  ointer to page c
4ab0: 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
4ac0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
4ad0: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
4ae0: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
4af0: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
4b00: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20  p processes */. 
4b10: 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20   Wal *pWal;     
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b30: 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  Write-ahead log 
4b40: 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c  used by "journal
4b50: 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 7d 3b  _mode=wal" */.};
4b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
4b70: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
4b80: 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e  iables hold coun
4b90: 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  ters used for.**
4ba0: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
4bb0: 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76  s only.  These v
4bc0: 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  ariables do not 
4bd0: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f  exist in.** a no
4be0: 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e  n-testing build.
4bf0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
4c00: 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64  s are not thread
4c10: 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  -safe..*/.#ifdef
4c20: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
4c30: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
4c40: 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  eaddb_count = 0;
4c50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4c60: 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64   full pages read
4c70: 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20   from DB */.int 
4c80: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
4c90: 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b  itedb_count = 0;
4ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4cb0: 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74  full pages writt
4cc0: 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20  en to DB */.int 
4cd0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
4ce0: 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  itej_count = 0; 
4cf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4d00: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
4d10: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65   journal */.# de
4d20: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
4d30: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
4d40: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4d50: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
4d60: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
4d70: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
4d80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
4d90: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
4da0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
4db0: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
4dc0: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
4dd0: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
4de0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
4df0: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
4e00: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
4e10: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
4e20: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
4e30: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
4e40: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
4e50: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
4e60: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
4e70: 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72  l is being.** wr
4e80: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
4e90: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
4ea0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
4eb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
4ec0: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
4ed0: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
4ee0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
4ef0: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
4f00: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
4f10: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
4f20: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
4f30: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
4f40: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
4f50: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
4f60: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
4f70: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
4f80: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
4f90: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
4fa0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
4fb0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
4fc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
4fd0: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
4fe0: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
4ff0: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
5000: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
5010: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
5020: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
5030: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
5040: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
5050: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
5060: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
5070: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
5080: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
5090: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
50a0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
50b0: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
50c0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
50d0: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
50e0: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
50f0: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
5100: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
5110: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
5120: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
5130: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
5140: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
5150: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
5160: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
5170: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
5180: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
5190: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
51a0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
51b0: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
51c0: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
51d0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
51e0: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
51f0: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
5200: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
5210: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
5220: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
5230: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
5240: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
5250: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
5260: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
5270: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5280: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5290: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
52a0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
52b0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
52c0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
52d0: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
52e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  he size of the o
52f0: 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f  f each page reco
5300: 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  rd in the journa
5310: 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  l is given by.**
5320: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
5330: 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  acro..*/.#define
5340: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
5350: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
5360: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
5370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
5380: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
5390: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
53a0: 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
53b0: 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a  the same .** siz
53c0: 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69  e as a single di
53d0: 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61  sk sector. See a
53e0: 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a  lso setSectorSiz
53f0: 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  e()..*/.#define 
5400: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5410: 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e  Pager) (pPager->
5420: 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a  sectorSize)../*.
5430: 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d  ** The macro MEM
5440: 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65  DB is true if we
5450: 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
5460: 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  h an in-memory d
5470: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64  atabase..** We d
5480: 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72  o this as a macr
5490: 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  o so that if the
54a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
54b0: 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73  ORYDB macro is s
54c0: 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  et,.** the value
54d0: 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62   of MEMDB will b
54e0: 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64  e a constant and
54f0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
5500: 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f  ll optimize.** o
5510: 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75  ut code that wou
5520: 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  ld never execute
5530: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5540: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
5550: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
5560: 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  0.#else.# define
5570: 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d   MEMDB pPager->m
5580: 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  emDb.#endif../*.
5590: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
55a0: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
55b0: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
55c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
55d0: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
55e0: 33 36 34 37 0a 0a 23 69 66 6e 64 65 66 20 4e 44  3647..#ifndef ND
55f0: 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67  EBUG ./*.** Usag
5600: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  e:.**.**   asser
5610: 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
5620: 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
5630: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
5640: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
5650: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
5660: 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d 70 2d 66  {..  /* A temp-f
5670: 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ile is always in
5680: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
5690: 20 6f 72 20 50 41 47 45 52 5f 53 59 4e 43 45 44   or PAGER_SYNCED
56a0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73   state. */.  ass
56b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
56c0: 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pFile==0 || pPag
56d0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
56e0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
56f0: 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65 43 6f   /* The changeCo
5700: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
5710: 61 6c 77 61 79 73 20 73 65 74 20 66 6f 72 20 74  always set for t
5720: 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a 20 20 61  emp-files */.  a
5730: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
5740: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
5750: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
5760: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72 65 74 75  tDone );..  retu
5770: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
5780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
5790: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
57a0: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
57b0: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
57c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
57d0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
57e0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
57f0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
5800: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
5810: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
5820: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
5830: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
5840: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
5850: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
5860: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
5870: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
5880: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
5890: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
58a0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
58b0: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
58c0: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
58d0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
58e0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
58f0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
5900: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
5910: 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  pPg){.  Pgno pgn
5920: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
5930: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
5940: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
5950: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5960: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
5970: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
5980: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
5990: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
59a0: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
59b0: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
59c0: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
59d0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e  e3BitvecTest(p->
59e0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
59f0: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
5a00: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
5a10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5a20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
5a30: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
5a40: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
5a50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
5a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5a70: 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  InJournal(PgHdr 
5a80: 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
5a90: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
5aa0: 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  t(pPg->pPager->p
5ab0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
5ac0: 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pgno);.}../*.** 
5ad0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
5ae0: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
5af0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
5b00: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
5b10: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
5b20: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
5b30: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
5b40: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
5b50: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
5b60: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
5b70: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
5b80: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
5b90: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
5ba0: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
5bb0: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
5bc0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
5bd0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
5be0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
5bf0: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
5c00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
5c10: 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [4];.  int rc = 
5c20: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
5c30: 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29  , ac, sizeof(ac)
5c40: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
5c50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5c60: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71  {.    *pRes = sq
5c70: 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63  lite3Get4byte(ac
5c80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5c90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
5ca0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
5cb0: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
5cc0: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
5cd0: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
5ce0: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75  r..*/.#define pu
5cf0: 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71  t32bits(A,B)  sq
5d00: 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75  lite3Put4byte((u
5d10: 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57  8*)A,B)../*.** W
5d20: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
5d30: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
5d40: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
5d50: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
5d60: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
5d70: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
5d80: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
5d90: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
5da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
5db0: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
5dc0: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
5dd0: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
5de0: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
5df0: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
5e00: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
5e10: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
5e20: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
5e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
5e40: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
5e50: 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20  macro is a file 
5e60: 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65  descriptor (type
5e70: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e   sqlite3_file*).
5e80: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
5e90: 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  it is not open, 
5ea0: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74  or non-zero (but
5eb0: 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73   not 1) if it is
5ec0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
5ed0: 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69  so that expressi
5ee0: 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74  ons can be writt
5ef0: 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  en as:.**.**   i
5f00: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
5f10: 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a  ->jfd) ){ ....**
5f20: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  .** instead of.*
5f30: 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65  *.**   if( pPage
5f40: 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
5f50: 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69   ){ ....*/.#defi
5f60: 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28  ne isOpen(pFd) (
5f70: 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29  (pFd)->pMethods)
5f80: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20  ../*.** If file 
5f90: 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c  pFd is open, cal
5fa0: 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  l sqlite3OsUnloc
5fb0: 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74  k() on it..*/.st
5fc0: 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63  atic int osUnloc
5fd0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
5fe0: 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  pFd, int eLock){
5ff0: 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
6000: 46 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Fd) ){.    retur
6010: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6020: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6030: 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65  3OsUnlock(pFd, e
6040: 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
6050: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
6060: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
6070: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
6080: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
6090: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
60a0: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
60b0: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
60c0: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
60d0: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
60e0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
60f0: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
6100: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
6110: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
6120: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
6130: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
6140: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
6150: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
6160: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
6170: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
6180: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
6190: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
61a0: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
61b0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ize..**.** The o
61c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61  ptimization is a
61d0: 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c  lso always enabl
61e0: 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
61f0: 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a   files. It is.**
6200: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c   an error to cal
6210: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
6220: 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65  if pPager is ope
6230: 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d  ned on an in-mem
6240: 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  ory.** database.
6250: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  .**.** If the op
6260: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f  timization canno
6270: 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20  t be used, 0 is 
6280: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
6290: 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20  can be used,.** 
62a0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
62b0: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73  eturned is the s
62c0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
62d0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a  al file when it.
62e0: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  ** contains roll
62f0: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
6300: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
6310: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
6320: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
6330: 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20  RITE.static int 
6340: 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50  jrnlBufferSize(P
6350: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6360: 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
6370: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
6380: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
6390: 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20    int dc;       
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68      /* Device ch
63c0: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
63d0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
63e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
63f0: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
6400: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74   size */.    int
6410: 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20   szPage;        
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6430: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a  * Page size */..
6440: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
6450: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
6460: 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74  ;.    dc = sqlit
6470: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
6480: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
6490: 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74  ->fd);.    nSect
64a0: 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63  or = pPager->sec
64b0: 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50  torSize;.    szP
64c0: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
64d0: 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73  geSize;..    ass
64e0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
64f0: 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
6500: 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72  >>8));.    asser
6510: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
6520: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
6530: 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30  >>8));.    if( 0
6540: 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f  ==(dc&(SQLITE_IO
6550: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
6560: 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74  ge>>8)) || nSect
6570: 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20  or>szPage) ){.  
6580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6590: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
65a0: 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  n JOURNAL_HDR_SZ
65b0: 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e  (pPager) + JOURN
65c0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
65d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
65e0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
65f0: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
6600: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
6610: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
6620: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
6630: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
6640: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
6650: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
6660: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
6670: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
6680: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
6690: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
66a0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
66b0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
66c0: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
66d0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
66e0: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
66f0: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
6700: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
6710: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
6720: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
6730: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
6740: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
6750: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
6760: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
6770: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
6780: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
6790: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
67a0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
67b0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
67c0: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
67d0: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
67e0: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
67f0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
6800: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
6810: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
6820: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
6830: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
6840: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
6850: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
6860: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
6870: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
6880: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
6890: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
68a0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
68b0: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
68c0: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
68d0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
68e0: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
68f0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
6900: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
6910: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
6920: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
6930: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
6940: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
6950: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
6960: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
6970: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
6980: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
6990: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
69a0: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
69b0: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
69c0: 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c  errCode.      ||
69d0: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
69e0: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
69f0: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
6a00: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
6a10: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
6a20: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
6a30: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
6a40: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
6a50: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
6a60: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
6a70: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
6a80: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
6a90: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
6aa0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
6ab0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
6ac0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
6ad0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
6ae0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
6af0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
6b00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6b10: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
6b20: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
6b30: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
6b40: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
6b50: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
6b60: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
6b70: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
6b80: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
6b90: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6ba0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
6bb0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
6bc0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
6bd0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
6be0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
6bf0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
6c00: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
6c10: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
6c20: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
6c30: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
6c40: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
6c50: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
6c60: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
6c70: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
6c80: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
6c90: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
6ca0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
6cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6cc0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
6cd0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
6ce0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
6cf0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
6d00: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
6d10: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
6d20: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
6d30: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
6d40: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
6d50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6d60: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
6d70: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
6d80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
6d90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6da0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
6db0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
6dc0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
6dd0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
6de0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
6df0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
6e00: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
6e10: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
6e20: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
6e30: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
6e40: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
6e50: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
6e60: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
6e70: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
6e80: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
6e90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6ea0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
6eb0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
6ec0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
6ed0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
6ee0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
6ef0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
6f00: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
6f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6f20: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
6f30: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
6f40: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
6f50: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
6f60: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
6f70: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
6f80: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
6f90: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
6fa0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6fb0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
6fc0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
6fd0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
6fe0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
6ff0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
7000: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
7010: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7030: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
7040: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
7050: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
7060: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
7070: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7080: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
7090: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
70a0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
70d0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
70e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
70f0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
7100: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
7110: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
7120: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
7130: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
7140: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
7150: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
7160: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
7170: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
7180: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7190: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
71a0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
71b0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
71c0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
71d0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
71e0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
71f0: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
7200: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
7210: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
7220: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
7230: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
7240: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
7250: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
7260: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
7270: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
7280: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
7290: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
72a0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
72b0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
72c0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
72d0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
72e0: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
72f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7300: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
7310: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
7320: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
7330: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
7340: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
7350: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
7360: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
7370: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
7380: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
7390: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
73a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
73b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
73c0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
73d0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
73e0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
73f0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
7400: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
7410: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
7420: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
7430: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
7440: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
7450: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
7460: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
7470: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
7480: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7490: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
74a0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
74b0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
74c0: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
74d0: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
74e0: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
74f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
7500: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
7510: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
7520: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
7530: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
7540: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
7550: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
7560: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
7570: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
7580: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75b0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
75e0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
75f0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
7600: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
7610: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
7620: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
7640: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
7650: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
7660: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
7670: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
7680: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
7690: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
76a0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
76b0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
76c0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
76d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
76e0: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
76f0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
7700: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
7710: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7720: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
7730: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
7740: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
7750: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
7760: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7770: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
7780: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
7790: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
77a0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
77b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
77c0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
77d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
77e0: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
77f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
7800: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
7810: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
7820: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
7830: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
7840: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
7850: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
7860: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
7870: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
7880: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
7890: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
78a0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
78b0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
78c0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
78d0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
78e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
78f0: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
7900: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
7910: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
7920: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
7930: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
7940: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
7950: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
7960: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
7970: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
7980: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
7990: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
79a0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
79b0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
79c0: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
79d0: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
79e0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
79f0: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
7a00: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
7a10: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
7a20: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
7a30: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
7a40: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
7a50: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
7a60: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
7a70: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
7a80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
7a90: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
7aa0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
7ab0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
7ac0: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
7ad0: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
7ae0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
7af0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
7b00: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
7b10: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
7b20: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
7b30: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
7b40: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
7b50: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
7b60: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7b70: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
7b80: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
7b90: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
7ba0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
7bb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7be0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
7bf0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7c00: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
7c10: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7c20: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
7c30: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
7c40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
7c50: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
7c60: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
7c70: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
7c80: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
7c90: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
7ca0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
7cb0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
7cc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7cd0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
7ce0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
7cf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7d00: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7d10: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
7d20: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
7d30: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7d40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
7d50: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
7d60: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
7d70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7d80: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
7d90: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
7da0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7db0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
7dc0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
7dd0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
7de0: 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
7df0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
7e00: 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e  s point the tran
7e10: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
7e20: 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69  tted but the wri
7e30: 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  te lock .    ** 
7e40: 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
7e50: 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
7e60: 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69  ere is a size li
7e70: 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66  mit configured f
7e80: 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  or .    ** the p
7e90: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
7ea0: 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  l and the journa
7eb0: 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
7ec0: 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20   consumes more. 
7ed0: 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e     ** space than
7ee0: 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f   that limit allo
7ef0: 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65  ws for, truncate
7f00: 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69   it now. There i
7f10: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a  s no need.    **
7f20: 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c   to sync the fil
7f30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  e following this
7f40: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
7f50: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
7f60: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d  QLITE_OK && iLim
7f70: 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36  it>0 ){.      i6
7f80: 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d  4 sz;.      rc =
7f90: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
7fa0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
7fb0: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
7fc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7fd0: 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   sz>iLimit ){.  
7fe0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7ff0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
8000: 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74  ger->jfd, iLimit
8010: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
8040: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8050: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
8060: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8070: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
8080: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
8090: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
80a0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
80b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
80c0: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
80d0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
80e0: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
80f0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
8100: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
8110: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
8120: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
8130: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
8140: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
8150: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
8160: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
8170: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
8180: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
8190: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
81a0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
81b0: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
81c0: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
81d0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
81e0: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
81f0: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
8200: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
8210: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
8220: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
8230: 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62  - 4 bytes: Datab
8240: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  ase page size..*
8250: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
8260: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
8270: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66  Z - 28) bytes of
8280: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
8290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
82a0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
82b0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
82c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
82d0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
82e0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
82f0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65  e */.  char *zHe
8300: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
8310: 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65  TmpSpace;  /* Te
8320: 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73  mporary space us
8330: 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64  ed to build head
8340: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61  er */.  u32 nHea
8350: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  der = pPager->pa
8360: 67 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 53  geSize;     /* S
8370: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f  ize of buffer po
8380: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61  inted to by zHea
8390: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72  der */.  u32 nWr
83a0: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  Bytes of header 
83d0: 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a  sector written *
83e0: 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
8410: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  counter */..  as
8420: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8430: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8440: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8450: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8460: 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  */..  if( nHeade
8470: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
8480: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
8490: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
84a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
84b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
84c0: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
84d0: 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61  savepoints and a
84e0: 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20  ny of them were 
84f0: 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69  created .  ** si
8500: 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nce the most rec
8510: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ent journal head
8520: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20  er was written, 
8530: 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a  update the .  **
8540: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
8550: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
8560: 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s now..  */.  fo
8570: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
8580: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
8590: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
85a0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
85b0: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d  [ii].iHdrOffset=
85c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
85d0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
85e0: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20  i].iHdrOffset = 
85f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8600: 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
8610: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8620: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
8630: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
8640: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
8650: 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  er);..  /* .  **
8660: 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
8670: 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62  Field - the numb
8680: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
8690: 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74  ds that follow t
86a0: 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  his.  ** journal
86b0: 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c   header. Normall
86c0: 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74  y, zero is writt
86d0: 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  en to this value
86e0: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20   at this time.. 
86f0: 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65   ** After the re
8700: 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20  cords are added 
8710: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28  to the journal (
8720: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
8730: 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66  synced, .  ** if
8740: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
8750: 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73  de), the zero is
8760: 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
8770: 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65  h the true numbe
8780: 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64  r.  ** of record
8790: 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e  s (see syncJourn
87a0: 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  al())..  **.  **
87b0: 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e   A faster altern
87c0: 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74  ative is to writ
87d0: 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20  e 0xFFFFFFFF to 
87e0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20  the nRec field. 
87f0: 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e  When.  ** readin
8800: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  g the journal th
8810: 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53  is value tells S
8820: 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20  QLite to assume 
8830: 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65  that the.  ** re
8840: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
8850: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
8860: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
8870: 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74  ds. This assumpt
8880: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67  ion.  ** is dang
8890: 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66  erous, as if a f
88a0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
88b0: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
88c0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
88d0: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
88e0: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
88f0: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
8900: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
8910: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
8920: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
8930: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
8940: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
8950: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
8960: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
8970: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
8980: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
8990: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
89a0: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
89b0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
89c0: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
89d0: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
89e0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
89f0: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
8a00: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
8a10: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
8a20: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
8a30: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
8a40: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
8a50: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
8a60: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
8a70: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
8a80: 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61  >noSync) || (pPa
8a90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
8aa0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
8ab0: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
8ac0: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
8ad0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
8ae0: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
8af0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
8b00: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
8b10: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
8b20: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
8b30: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
8b40: 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74  Magic));.    put
8b50: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
8b60: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8b70: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
8b80: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
8b90: 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72    memset(zHeader
8ba0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  , 0, sizeof(aJou
8bb0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20  rnalMagic)+4);. 
8bc0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e   }..  /* The ran
8bd0: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
8be0: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
8bf0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
8c00: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
8c10: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
8c20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8c30: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
8c40: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
8c50: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
8c60: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
8c70: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
8c80: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
8c90: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
8ca0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8cb0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8cc0: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
8cd0: 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f  dbOrigSize);.  /
8ce0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
8cf0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
8d00: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
8d10: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8d20: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8d30: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
8d40: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8d50: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67  );..  /* The pag
8d60: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
8d70: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
8d80: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8d90: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
8da0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
8db0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20  /* Initializing 
8dc0: 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20  the tail of the 
8dd0: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65  buffer is not ne
8de0: 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74  cessary.  Everyt
8df0: 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20  hing.  ** works 
8e00: 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c  find if the foll
8e10: 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69  owing memset() i
8e20: 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20  s omitted.  But 
8e30: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a  initializing.  *
8e40: 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65  * the memory pre
8e50: 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66  vents valgrind f
8e60: 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c  rom complaining,
8e70: 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69   so we are willi
8e80: 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20  ng to.  ** take 
8e90: 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  the performance 
8ea0: 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  hit..  */.  mems
8eb0: 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  et(&zHeader[size
8ec0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8ed0: 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20  )+20], 0,.      
8ee0: 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65     nHeader-(size
8ef0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8f00: 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e  )+20));..  /* In
8f10: 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f   theory, it is o
8f20: 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f  nly necessary to
8f30: 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79   write the 28 by
8f40: 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20  tes that the .  
8f50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
8f60: 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68  r consumes to th
8f70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
8f80: 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d  ere. Then increm
8f90: 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ent the .  ** Pa
8fa0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76  ger.journalOff v
8fb0: 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e  ariable by JOURN
8fc0: 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61  AL_HDR_SZ so tha
8fd0: 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a  t the next .  **
8fe0: 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74   record is writt
8ff0: 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  en to the follow
9000: 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76  ing sector (leav
9010: 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65  ing a gap in the
9020: 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20   file.  ** that 
9030: 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74  will be implicit
9040: 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20  ly filled in by 
9050: 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20  the OS)..  **.  
9060: 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61  ** However it ha
9070: 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65  s been discovere
9080: 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73  d that on some s
9090: 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74  ystems this patt
90a0: 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65  ern can .  ** be
90b0: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73   significantly s
90c0: 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69  lower than conti
90d0: 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20  guously writing 
90e0: 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
90f0: 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74  ,.  ** even if t
9100: 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63  hat means explic
9110: 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  itly writing dat
9120: 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f  a to the block o
9130: 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c  f .  ** (JOURNAL
9140: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
9150: 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f  tes that will no
9160: 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68  t be used. So th
9170: 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20  at is what.  ** 
9180: 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20  is done. .  **. 
9190: 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20   ** The loop is 
91a0: 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e  required here in
91b0: 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72   case the sector
91c0: 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20  -size is larger 
91d0: 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64  than the .  ** d
91e0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
91f0: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65  e. Since the zHe
9200: 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f  ader buffer is o
9210: 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69  nly Pager.pageSi
9220: 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e  ze.  ** bytes in
9230: 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e   size, more than
9240: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   one call to sql
9250: 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61  ite3OsWrite() ma
9260: 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20  y be required.  
9270: 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  ** to populate t
9280: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
9290: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
92a0: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72  .  */ .  for(nWr
92b0: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
92c0: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
92d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
92e0: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
92f0: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
9300: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
9310: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
9320: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9330: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
9340: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9350: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
9360: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
9370: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
9380: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61  urnalOff);.    a
9390: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
93a0: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
93b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
93c0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
93d0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65  ournalOff += nHe
93e0: 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ader;.  }..  ret
93f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9400: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
9410: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
9420: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
9430: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
9440: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
9450: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
9460: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
9470: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9480: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9490: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68  rnal.** file. Th
94a0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
94b0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
94c0: 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20  l file is given 
94d0: 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  by.** pPager->jo
94e0: 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f  urnalOff. See co
94f0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
9500: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
9510: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
9520: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
9530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
9540: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
9550: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
9560: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
9570: 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73  lly, *pNRec is s
9580: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
9590: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
95a0: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
95b0: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70  is header and *p
95c0: 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  DbSize is set to
95d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
95e0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
95f0: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
9600: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
9610: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
9620: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
9630: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
9640: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
9650: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9660: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
9670: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
9680: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
9690: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
96a0: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
96b0: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
96c0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
96d0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
96e0: 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44  d *pNRec and *PD
96f0: 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69  bSize are undefi
9700: 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  ned.  If JOURNAL
9710: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
9720: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
9730: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9740: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
9750: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
9760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
9770: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
9780: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
97a0: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
97b0: 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20  .  int isHot,.  
97c0: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97e0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Size of the open
97f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
9800: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
9810: 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pNRec,         
9820: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
9830: 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   Value read from
9840: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
9850: 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  */.  u32 *pDbSiz
9860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
9870: 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20    /* OUT: Value 
9880: 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  of original data
9890: 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20  base size field 
98a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
98d0: 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ode */.  unsigne
98e0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
98f0: 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65  ;     /* A buffe
9900: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
9910: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
9920: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9940: 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61  Offset of journa
9950: 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72  l header being r
9960: 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ead */..  assert
9970: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9980: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
9990: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
99a0: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
99b0: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67    /* Advance Pag
99c0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f  er.journalOff to
99d0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
99e0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49  e next sector. I
99f0: 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  f the.  ** journ
9a00: 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73  al file is too s
9a10: 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74  mall for there t
9a20: 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74  o be a header st
9a30: 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a  ored at this.  *
9a40: 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20  * point, return 
9a50: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
9a60: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  /.  pPager->jour
9a70: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
9a80: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
9a90: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9aa0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52  >journalOff+JOUR
9ab0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9ac0: 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65  r) > journalSize
9ad0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9ae0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
9af0: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
9b00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9b10: 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
9b20: 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20  e first 8 bytes 
9b30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
9b40: 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64  eader. If they d
9b50: 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a  o not match.  **
9b60: 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69   the  magic stri
9b70: 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20  ng found at the 
9b80: 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f  start of each jo
9b90: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65  urnal header, re
9ba0: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
9bb0: 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20  _DONE. If an IO 
9bc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
9bd0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
9be0: 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  de. Otherwise,. 
9bf0: 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a   ** proceed..  *
9c00: 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c  /.  if( isHot ||
9c10: 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72   iHdrOff!=pPager
9c20: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a  ->journalHdr ){.
9c30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9c40: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
9c50: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
9c60: 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72  of(aMagic), iHdr
9c70: 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Off);.    if( rc
9c80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9c90: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
9ca0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
9cb0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
9cc0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
9cd0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
9ce0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
9cf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9d00: 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
9d10: 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65  three 32-bit fie
9d20: 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  lds of the journ
9d30: 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e  al header: The n
9d40: 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20  Rec.  ** field, 
9d50: 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69  the checksum-ini
9d60: 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65  tializer and the
9d70: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
9d80: 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  t the start.  **
9d90: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
9da0: 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ion. Return an e
9db0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
9dc0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
9dd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
9de0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
9df0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
9e00: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c  >jfd, iHdrOff+8,
9e10: 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53   pNRec)).   || S
9e20: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9e30: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9e40: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9e50: 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  12, &pPager->cks
9e60: 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53  umInit)).   || S
9e70: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9e80: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9e90: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9ea0: 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20  16, pDbSize)).  
9eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9ec0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
9ed0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
9ee0: 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50  =0 ){.    u32 iP
9ef0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
9f00: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73         /* Page-s
9f10: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
9f20: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
9f30: 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69     u32 iSectorSi
9f40: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
9f50: 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66  /* Sector-size f
9f60: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
9f70: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31  header */.    u1
9f80: 36 20 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20  6 iPageSize16;  
9f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
9fa0: 70 79 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20  py of iPageSize 
9fb0: 69 6e 20 31 36 2d 62 69 74 20 76 61 72 69 61 62  in 16-bit variab
9fc0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  le */..    /* Re
9fd0: 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ad the page-size
9fe0: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
9ff0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a000: 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69  fields. */.    i
a010: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
a020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
a040: 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72  Off+20, &iSector
a050: 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53  Size)).     || S
a060: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
a070: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a080: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
a090: 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29  24, &iPageSize))
a0a0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
a0b0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
a0c0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
a0d0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
a0e0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
a0f0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
a100: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
a110: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
a120: 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
a130: 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
a140: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
a150: 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
a160: 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
a170: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
a180: 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
a190: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
a1a0: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
a1b0: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
a1c0: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
a1d0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
a1e0: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
a210: 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
a220: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
a230: 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
a240: 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
a250: 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
a260: 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
a270: 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
a280: 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
a290: 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
a2a0: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
a2b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
a2c0: 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
a2d0: 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
a2e0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
a2f0: 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
a300: 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
a310: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a320: 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
a330: 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
a340: 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
a350: 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
a360: 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
a370: 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
a380: 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
a390: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
a3a0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
a3b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
a3c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
a3d0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
a3e0: 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
a3f0: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
a400: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
a410: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
a420: 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
a430: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
a440: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
a450: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
a460: 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
a470: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
a480: 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
a490: 20 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a   */.    iPageSiz
a4a0: 65 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65  e16 = (u16)iPage
a4b0: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
a4c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a4d0: 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
a4e0: 69 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29  iPageSize16, -1)
a4f0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a500: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
a510: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
a520: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50  =SQLITE_OK || iP
a530: 61 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29  ageSize16==(u16)
a540: 69 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20  iPageSize );..  
a550: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a560: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
a570: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
a580: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
a590: 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
a5a0: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
a5b0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
a5c0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
a5d0: 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
a5e0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
a5f0: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
a600: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
a610: 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
a620: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
a630: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
a640: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
a650: 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
a660: 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
a670: 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
a680: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
a690: 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
a6a0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
a6b0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
a6c0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
a6d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a6e0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
a6f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
a700: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
a710: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
a720: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
a730: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
a740: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
a750: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
a760: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
a770: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
a780: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
a790: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
a7a0: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
a7b0: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
a7c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
a7d0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
a7e0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
a7f0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
a800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
a810: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
a820: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
a830: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
a840: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
a850: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
a860: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
a870: 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
a880: 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
a890: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
a8a0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
a8b0: 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
a8c0: 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
a8d0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
a8e0: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
a8f0: 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
a900: 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
a910: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
a920: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
a930: 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
a940: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
a950: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
a960: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a970: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
a980: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
a990: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
a9a0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
a9b0: 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
a9c0: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
a9d0: 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
a9e0: 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
a9f0: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
aa00: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
aa10: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
aa20: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
aa30: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
aa40: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
aa50: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
aa60: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
aa70: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
aa80: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
aa90: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
aaa0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
aad0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
aae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aaf0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
ab00: 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
ab10: 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
ab20: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
ab30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
ab40: 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
ab50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
ab60: 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab80: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
ab90: 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
aba0: 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
abb0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
abc0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
abd0: 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
abe0: 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20  aster */..  if( 
abf0: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
ac00: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20 20  er->setMaster.  
ac10: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
ac20: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ac30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
ac40: 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  Y .   || pPager-
ac50: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
ac60: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ac70: 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  OFF .  ){.    re
ac80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ac90: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
aca0: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
acb0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
acc0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
acd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ace0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
acf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ad00: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
ad10: 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
ad20: 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
ad30: 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
ad40: 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
ad50: 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
ad60: 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
ad70: 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
ad80: 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
ad90: 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
ada0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
adb0: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
adc0: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
add0: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
ade0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
adf0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
ae00: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
ae10: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
ae20: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
ae30: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
ae40: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ae50: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
ae60: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
ae70: 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
ae80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ae90: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
aea0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
aeb0: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
aec0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
aed0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
aee0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
aef0: 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
af00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
af10: 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
af20: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
af30: 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
af40: 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
af50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
af60: 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
af70: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
af80: 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
af90: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
afa0: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
afb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
afc0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
afd0: 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
afe0: 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
aff0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
b000: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
b010: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
b020: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
b030: 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
b040: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
b050: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b060: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
b070: 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
b080: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
b090: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b0a0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b0b0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
b0c0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
b0d0: 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
b0e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
b0f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
b100: 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
b110: 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  r+20);.  pPager-
b120: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
b130: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20  ger->noSync;..  
b140: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
b150: 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
b160: 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
b170: 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
b180: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
b190: 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
b1a0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
b1b0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
b1c0: 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
b1d0: 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
b1e0: 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
b1f0: 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
b200: 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
b210: 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
b220: 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
b230: 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
b240: 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
b250: 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
b260: 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
b270: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
b280: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
b290: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b2a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
b2b0: 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
b2c0: 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
b2d0: 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
b2e0: 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
b2f0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
b300: 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
b310: 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
b320: 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
b330: 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
b340: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
b350: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
b360: 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
b370: 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
b380: 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
b390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b3a0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
b3b0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
b3c0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
b3d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b3e0: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
b3f0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
b400: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
b410: 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e  e number. Return
b420: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
b430: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
b440: 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  L if the request
b450: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a  ed page is not .
b460: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65  ** already in me
b470: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
b480: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b490: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b4a0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b4b0: 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
b4e0: 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  ue */..  /* It i
b4f0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
b500: 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61  or a call to Pca
b510: 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20  cheFetch() with 
b520: 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f  createFlag==0 to
b530: 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63  .  ** fail, sinc
b540: 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  e no attempt to 
b550: 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63  allocate dynamic
b560: 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20   memory will be 
b570: 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f  made..  */.  (vo
b580: 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65  id)sqlite3Pcache
b590: 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
b5a0: 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
b5b0: 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  &p);.  return p;
b5c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  .}../*.** Unless
b5d0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
b5e0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69   error-state, di
b5f0: 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
b600: 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a  ory pages. If.**
b610: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
b620: 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68   error-state, th
b630: 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
b640: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
b650: 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20  ODO: Why can we 
b660: 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70 61  not reset the pa
b670: 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72  ger while in err
b680: 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61  or state?.*/.sta
b690: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
b6a0: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
b6b0: 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54  er){.  if( SQLIT
b6c0: 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72  E_OK==pPager->er
b6d0: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  rCode ){.    sql
b6e0: 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
b6f0: 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
b700: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  p);.    sqlite3P
b710: 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
b720: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
b730: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
b740: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alid = 0;.  }.}.
b750: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
b760: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
b770: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
b780: 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
b790: 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
b7a0: 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
b7b0: 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
b7c0: 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
b7d0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
b7e0: 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
b7f0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
b800: 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
b810: 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
b820: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
b830: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
b840: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
b850: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
b860: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
b870: 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
b880: 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
b890: 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
b8a0: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
b8b0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
b8c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
b8d0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
b8e0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b8f0: 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
b900: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
b910: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
b920: 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d  de || sqlite3IsM
b930: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
b940: 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73  ->sjfd) ){.    s
b950: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
b960: 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d  ager->sjfd);.  }
b970: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
b980: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b990: 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  nt);.  pPager->a
b9a0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
b9b0: 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
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 75 62 52 65 63 20 3d 20 30 3b 0a  r->nSubRec = 0;.
b9e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
b9f0: 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f   bit number pgno
ba00: 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76   in the PagerSav
ba10: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
ba20: 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20  int .** bitvecs 
ba30: 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  of all open save
ba40: 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53  points. Return S
ba50: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
ba60: 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c  essful.** or SQL
ba70: 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
ba80: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
ba90: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
baa0: 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69  int addToSavepoi
bab0: 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20  ntBitvecs(Pager 
bac0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
bad0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  no){.  int ii;  
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bb00: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bb10: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bb20: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
bb30: 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  /..  for(ii=0; i
bb40: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
bb50: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
bb60: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
bb70: 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
bb80: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20  avepoint[ii];.  
bb90: 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e    if( pgno<=p->n
bba0: 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
bbb0: 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65   |= sqlite3Bitve
bbc0: 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70  cSet(p->pInSavep
bbd0: 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  oint, pgno);.   
bbe0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
bbf0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
bc00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
bc10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
bc20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bc30: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
bc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bc50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
bc60: 69 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73  if this pager us
bc70: 65 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64  es a write-ahead
bc80: 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20   log instead of 
bc90: 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c  the usual.** rol
bca0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f  lback journal. O
bcb0: 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
bcc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
bcd0: 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72 20  gerUseWal(Pager 
bce0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
bcf0: 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  rn (pPager->pWal
bd00: 21 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  !=0);.}../*.** U
bd10: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
bd20: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75  se file. This fu
bd30: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
bd40: 70 20 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a  p if the pager.*
bd50: 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  * is in exclusiv
bd60: 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e mode..**.** If
bd70: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
bd80: 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72  rrently in error
bd90: 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20   state, discard 
bda0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
bdb0: 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e  .** the cache an
bdc0: 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65  d reset the Page
bdd0: 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65  r structure inte
bde0: 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74  rnal state. If t
bdf0: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70  here is.** an op
be00: 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c  en journal-file,
be10: 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74   then the next t
be20: 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  ime a shared-loc
be30: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  k is obtained.**
be40: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69   on the pager fi
be50: 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61  le (by this or a
be60: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
be70: 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a  ), it will be.**
be80: 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f   treated as a ho
be90: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
bea0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
beb0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
bec0: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
bed0: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
bee0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
bef0: 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
bf00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
bf10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
bf20: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f  n code */..    /
bf30: 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74  * Always close t
bf40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bf50: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
bf60: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
bf70: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
bf80: 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  e, another conne
bf90: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
bfa0: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
bfb0: 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65  ight.    ** dele
bfc0: 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20  te the file out 
bfd0: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
bfe0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
bff0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c000: 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  >jfd);.    sqlit
c010: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
c020: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
c030: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
c040: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
c050: 0a 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  .    releaseAllS
c060: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
c070: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
c080: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
c090: 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73  ed, somebody els
c0a0: 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  e might change i
c0b0: 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61  t. The.    ** va
c0c0: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50  lues stored in P
c0d0: 61 67 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e  ager.dbSize etc.
c0e0: 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e   might become in
c0f0: 76 61 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20  valid if.    ** 
c100: 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 4f  this happens.  O
c110: 6e 65 20 63 61 6e 20 61 72 67 75 65 20 74 68 61  ne can argue tha
c120: 74 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e  t this doesn't n
c130: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
c140: 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74  d.    ** until t
c150: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
c160: 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e  r check fails in
c170: 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   PagerSharedLock
c180: 28 29 2e 0a 20 20 20 20 2a 2a 20 43 6c 65 61 72  ()..    ** Clear
c190: 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
c1a0: 65 20 63 61 63 68 65 20 68 65 72 65 20 69 73 20  e cache here is 
c1b0: 62 65 69 6e 67 20 63 6f 6e 73 65 72 76 61 74 69  being conservati
c1c0: 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ve..    */.    p
c1d0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
c1e0: 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  id = 0;..    if(
c1f0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
c200: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ger) ){.      sq
c210: 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 53 6e 61  lite3WalCloseSna
c220: 70 73 68 6f 74 28 70 50 61 67 65 72 2d 3e 70 57  pshot(pPager->pW
c230: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
c240: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c        rc = osUnl
c250: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c260: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  NO_LOCK);.    }.
c270: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c280: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
c290: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  ode = rc;.    }.
c2a0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c2b0: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
c2c0: 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er))..    /* If 
c2d0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
c2e0: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
c2f0: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
c300: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
c310: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
c320: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
c330: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
c340: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
c350: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
c360: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
c370: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
c380: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
c390: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
c3a0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c3b0: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
c3c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c3d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
c3e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
c3f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c400: 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f    }.      pager_
c410: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
c420: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
c430: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
c440: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
c450: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
c460: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61  _UNLOCK;.    pPa
c470: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
c480: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c490: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c4a0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
c4b0: 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20   when an IOERR, 
c4c0: 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20  CORRUPT or FULL 
c4d0: 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76  error.** may hav
c4e0: 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20  e occurred. The 
c4f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
c500: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
c510: 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72  he pager .** str
c520: 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
c530: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
c540: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
c550: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
c560: 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69  r .** API functi
c570: 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
c580: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
c590: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
c5a0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74  rgument .** to t
c5b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
c5c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
c5d0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
c5e0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
c5f0: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
c600: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
c610: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
c620: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
c630: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
c640: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
c650: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
c660: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
c670: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
c680: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
c690: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
c6a0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
c6b0: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
c6c0: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
c6d0: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
c6e0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
c6f0: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
c700: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
c710: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
c720: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
c730: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
c740: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c750: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
c760: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
c770: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
c780: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
c790: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
c7a0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
c7b0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
c7c0: 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
c7d0: 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
c7e0: 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
c7f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c800: 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
c810: 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
c820: 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
c830: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
c840: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
c850: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
c860: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
c870: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
c880: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
c890: 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
c8a0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
c8b0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
c8c0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
c8d0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
c8e0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
c8f0: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
c900: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
c910: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
c920: 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
c930: 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
c940: 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
c950: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c960: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
c970: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c980: 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c  * Execute a roll
c990: 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61  back if a transa
c9a0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
c9b0: 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
c9c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
c9d0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
c9e0: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
c9f0: 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
ca00: 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ror state, do no
ca10: 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68  t attempt .** th
ca20: 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68  e rollback at th
ca30: 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64  is time. Instead
ca40: 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  , pager_unlock()
ca50: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a   is called. The.
ca60: 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
ca70: 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64  _unlock() will d
ca80: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
ca90: 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f  mory pages, unlo
caa0: 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ck.** the databa
cab0: 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61  se file and clea
cac0: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
cad0: 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73  e. If this means
cae0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69   that.** there i
caf0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
cb00: 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
cb10: 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78  -system, the nex
cb20: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  t connection.** 
cb30: 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
cb40: 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
cb50: 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
cb60: 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c  be this one) wil
cb70: 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63  l.** roll it bac
cb80: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
cb90: 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
cba0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
cbb0: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62  e error state, b
cbc0: 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
cbd0: 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
cbe0: 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
cbf0: 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
cc00: 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
cc10: 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
cc20: 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
cc30: 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  or state. Which 
cc40: 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
cc50: 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
cc60: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
cc70: 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
cc80: 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
cc90: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
cca0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
ccb0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
ccc0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
ccd0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  e==SQLITE_OK && 
cce0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
ccf0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
cd00: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
cd10: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
cd20: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
cd30: 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
cd40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
cd50: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
cd60: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
cd70: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ock(pPager);.}..
cd80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
cd90: 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
cda0: 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63  ction. A transac
cdb0: 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20  tion is usually 
cdc0: 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74  ended by .** eit
cdd0: 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  her a COMMIT or 
cde0: 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61  a ROLLBACK opera
cdf0: 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  tion. This routi
ce00: 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ne may be called
ce10: 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62   .** after rollb
ce20: 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ack of a hot-jou
ce30: 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  rnal, or if an e
ce40: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
ce50: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65  e opening.** the
ce60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
ce70: 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72   writing the ver
ce80: 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  y first journal-
ce90: 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64  header of a.** d
cea0: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
ceb0: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ion..** .** If t
cec0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  he pager is in P
ced0: 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50  AGER_SHARED or P
cee0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
cef0: 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72  e when this.** r
cf00: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
cf10: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20  , it is a no-op 
cf20: 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f  (returns SQLITE_
cf30: 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  OK)..**.** Other
cf40: 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65  wise, any active
cf50: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
cf60: 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
cf70: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
cf80: 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
cf90: 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a  n it is "finaliz
cfa0: 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72  ed". Once a jour
cfb0: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73  nal .** file has
cfc0: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
cfd0: 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
cfe0: 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20  le to use it to 
cff0: 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20  roll back a .** 
d000: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72  transaction. Nor
d010: 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73   will it be cons
d020: 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68  idered to be a h
d030: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68  ot-journal by th
d040: 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68  is.** or any oth
d050: 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
d060: 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20  ection. Exactly 
d070: 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  how a journal is
d080: 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65   finalized.** de
d090: 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
d0a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65   or not the page
d0b0: 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
d0c0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
d0d0: 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  nd.** the curren
d0e0: 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28  t journal-mode (
d0f0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
d100: 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c  e value), as fol
d110: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  lows:.**.**   jo
d120: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
d130: 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  Y.**     Journal
d140: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d150: 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65   is simply close
d160: 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73  d. This destroys
d170: 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d   an .**     in-m
d180: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  emory journal..*
d190: 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
d1a0: 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20  de==TRUNCATE.** 
d1b0: 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
d1c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
d1d0: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
d1e0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ize..**.**   jou
d1f0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
d200: 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72  T.**     The fir
d210: 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74  st 28 bytes of t
d220: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d230: 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73  are zeroed. This
d240: 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20   invalidates.** 
d250: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f      the first jo
d260: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
d270: 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65  the file, and he
d280: 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  nce the entire j
d290: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
d2a0: 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a  le. An invalid j
d2b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e  ournal file cann
d2c0: 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
d2d0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  k..**.**   journ
d2e0: 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a  alMode==DELETE.*
d2f0: 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  *     The journa
d300: 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
d310: 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69   and deleted usi
d320: 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
d330: 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te()..**.**     
d340: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
d350: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
d360: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20  sive mode, this 
d370: 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69  method of finali
d380: 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  zing.**     the 
d390: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
d3a0: 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74  never used. Inst
d3b0: 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  ead, if the jour
d3c0: 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20  nalMode is.**   
d3d0: 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65    DELETE and the
d3e0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
d3f0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
d400: 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
d410: 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a  d under.**     j
d420: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
d430: 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74  IST is used inst
d440: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ead..**.** After
d450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
d460: 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75  finalized, if ru
d470: 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63  nning in non-exc
d480: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
d490: 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20  .** pager moves 
d4a0: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
d4b0: 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67  state (and downg
d4c0: 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f  rades the lock o
d4d0: 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
d4e0: 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67  e file according
d4f0: 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ly)..**.** If th
d500: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
d510: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
d520: 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50  mode and is in P
d530: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
d540: 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74  e,.** it moves t
d550: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
d560: 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  E. No locks are 
d570: 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20  downgraded when 
d580: 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78  running in.** ex
d590: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
d5a0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
d5b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
d5c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
d5d0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d5e0: 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
d5f0: 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
d600: 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
d610: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d620: 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
d630: 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
d640: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
d650: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
d660: 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
d670: 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
d680: 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
d690: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
d6a0: 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
d6b0: 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
d6c0: 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
d6d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
d6e0: 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
d6f0: 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
d700: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
d710: 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
d720: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
d730: 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
d740: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
d750: 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
d760: 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
d770: 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
d780: 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
d790: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d7a0: 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
d7b0: 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
d7c0: 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
d7d0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
d7e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
d7f0: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
d800: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
d810: 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
d820: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
d830: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d840: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
d850: 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
d860: 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
d870: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
d880: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
d890: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
d8a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d8b0: 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  }.  releaseAllSa
d8c0: 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
d8d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ;..  assert( isO
d8e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
d8f0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
d900: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
d910: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
d920: 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
d930: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
d940: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
d950: 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
d960: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
d970: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
d980: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
d990: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
d9a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
d9b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
d9c0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
d9d0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
d9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
d9f0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
da00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
da10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
da20: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
da30: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
da40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
da50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
da60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
da70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
da80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
daa0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
dab0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
dac0: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
dad0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
dae0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
daf0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
db00: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
db10: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
db20: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
db30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
db40: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
db50: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
db60: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
db70: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
db80: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
db90: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
dba0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
dbb0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
dbc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
dbd0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dbe0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
dbf0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
dc00: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
dc10: 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
dc20: 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
dc30: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
dc40: 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
dc50: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
dc60: 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
dc70: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
dc80: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
dc90: 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
dca0: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
dcb0: 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
dcc0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
dcd0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
dce0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
dcf0: 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
dd00: 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
dd10: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
dd20: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
dd30: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
dd40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
dd50: 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
dd60: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
dd70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
dd80: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
dd90: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
dda0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
ddb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
ddc0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ddd0: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
dde0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
ddf0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
de00: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
de10: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
de20: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
de30: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
de40: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
de50: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
de60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
de70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
de80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
de90: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
dea0: 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
deb0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
dec0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
ded0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
dee0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
def0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
df00: 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
df10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
df20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
df30: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
df40: 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
df50: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
df60: 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
df70: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
df80: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
df90: 61 6c 57 72 69 74 65 4c 6f 63 6b 28 70 50 61 67  alWriteLock(pPag
dfa0: 65 72 2d 3e 70 57 61 6c 2c 20 30 29 3b 0a 20 20  er->pWal, 0);.  
dfb0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
dfc0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
dfd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
dfe0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
dff0: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
e000: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
e010: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
e020: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
e030: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
e040: 52 45 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  RED;.    pPager-
e050: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
e060: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
e070: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
e080: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
e090: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
e0a0: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
e0b0: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
e0c0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
e0d0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
e0e0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
e0f0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
e100: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a  = 0;..  /* TODO:
e110: 20 49 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c   Is this optimal
e120: 3f 20 57 68 79 20 69 73 20 74 68 65 20 64 62 20  ? Why is the db 
e130: 73 69 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64  size invalidated
e140: 20 68 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e   here .  ** when
e150: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e160: 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b  le is not unlock
e170: 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ed? */.  pPager-
e180: 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b  >dbOrigSize = 0;
e190: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
e1a0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
e1b0: 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
e1c0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28  ->dbSize);.  if(
e1d0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70   !MEMDB ){.    p
e1e0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
e1f0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  id = 0;.  }..  r
e200: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
e210: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
e220: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
e230: 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e   aData must poin
e240: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
e250: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e260: 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
e270: 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  ta. Compute and 
e280: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
e290: 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20  m based ont the 
e2a0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
e2b0: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61  .** page of data
e2c0: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
e2d0: 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72   value of pPager
e2e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a  ->cksumInit..**.
e2f0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
e300: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
e310: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
e320: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
e330: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
e340: 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65  ial value (pPage
e350: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e  r->cksumInit) an
e360: 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79  d every 200th by
e370: 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  te.** of the pag
e380: 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67  e data, starting
e390: 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65   with byte offse
e3a0: 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t (pPager->pageS
e3b0: 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63  ize%200)..** Eac
e3c0: 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
e3d0: 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69  reted as an 8-bi
e3e0: 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  t unsigned integ
e3f0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69  er..**.** Changi
e400: 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75  ng the formula u
e410: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
e420: 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73  his checksum res
e430: 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ults in an.** in
e440: 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e  compatible journ
e450: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  al file format..
e460: 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c  **.** If journal
e470: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
e480: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
e490: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
e4a0: 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73  ost likely .** s
e4b0: 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20  cenario is that 
e4c0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
e4d0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
e4e0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
e4f0: 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75  ed. .** It is mu
e500: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
e510: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
e520: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e530: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
e540: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
e550: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
e560: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
e570: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
e580: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
e590: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
e5a0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
e5b0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
e5c0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
e5d0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
e5e0: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
e5f0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
e600: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
e610: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
e620: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
e630: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c   /* Checksum val
e640: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
e650: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
e660: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20  ->pageSize-200; 
e670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
e680: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68   counter */.  wh
e690: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
e6a0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
e6b0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
e6c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
e6d0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
e6e0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
e6f0: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
e700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
e710: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
e720: 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
e730: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
e740: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
e750: 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
e760: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
e770: 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
e780: 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
e790: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
e7a0: 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
e7b0: 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
e7c0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
e7d0: 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
e7e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
e7f0: 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e  ** The isMainJrn
e800: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  l flag is true i
e810: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
e820: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
e830: 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65  nal and.** false
e840: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
e850: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  nt journal.  The
e860: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
e870: 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63  ournal uses.** c
e880: 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
e890: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
e8a0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a   does not..**.**
e8b0: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
e8c0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
e8d0: 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
e8e0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
e8f0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
e900: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
e910: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
e920: 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
e930: 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
e940: 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
e950: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
e960: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
e970: 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
e980: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
e990: 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
e9a0: 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
e9b0: 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
e9c0: 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
e9d0: 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
e9e0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
e9f0: 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
ea00: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
ea10: 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
ea20: 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
ea30: 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
ea40: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
ea50: 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
ea60: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
ea70: 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
ea80: 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
ea90: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
eaa0: 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
eab0: 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
eac0: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
ead0: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
eae0: 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
eaf0: 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
eb00: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
eb10: 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
eb20: 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
eb30: 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
eb40: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
eb50: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
eb60: 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
eb70: 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
eb80: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
eb90: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
eba0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
ebb0: 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
ebc0: 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
ebd0: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
ebe0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
ebf0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
ec00: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
ec10: 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
ec20: 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
ec30: 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
ec40: 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
ec50: 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
ec60: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
ec70: 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
ec80: 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
ec90: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
eca0: 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
ecb0: 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
ecc0: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
ecd0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
ece0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
ecf0: 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
ed00: 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
ed10: 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
ed20: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
ed30: 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
ed40: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
ed50: 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
ed60: 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
ed70: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
ed80: 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
ed90: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
eda0: 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
edb0: 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
edc0: 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
edd0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
ede0: 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
edf0: 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
ee00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
ee10: 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
ee20: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
ee30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
ee40: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
ee50: 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
ee60: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
ee70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
ee80: 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
ee90: 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a   back */.  i64 *
eea0: 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
eeb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
eec0: 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
eed0: 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69  playback */.  Bi
eee0: 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20  tvec *pDone,    
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ef00: 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
ef10: 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
ef20: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
ef30: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
ef40: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
ef50: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
ef60: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
ef70: 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74  .  int isSavepnt
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
efa0: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
efb0: 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
efc0: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
eff0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
f000: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
f010: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
f020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
f030: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
f040: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
f050: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
f080: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
f090: 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  cking */.  char 
f0a0: 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
f0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
f0c0: 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f  orary storage fo
f0d0: 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  r the page */.  
f0e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
f0f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
f100: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
f110: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75  ptor for the jou
f120: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
f130: 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20  nt isSynced;    
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f150: 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
f160: 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a  page is synced *
f170: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
f180: 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
f190: 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
f1a0: 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
f1b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
f1c0: 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
f1d0: 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
f1e0: 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
f1f0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
f200: 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
f210: 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
f220: 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
f230: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
f240: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
f250: 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
f260: 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
f270: 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
f280: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
f290: 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70  Data = pPager->p
f2a0: 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65  TmpSpace;.  asse
f2b0: 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20  rt( aData );    
f2c0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
f2d0: 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  rage must have a
f2e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
f2f0: 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  cated */.  asser
f300: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
f310: 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69  Pager)==0 || (!i
f320: 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53  sMainJrnl && isS
f330: 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a  avepnt) );..  /*
f340: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
f350: 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
f360: 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
f370: 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
f380: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
f390: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
f3a0: 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
f3b0: 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
f3c0: 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
f3d0: 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
f3e0: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
f3f0: 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
f400: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
f410: 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
f420: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
f430: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
f440: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
f450: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
f460: 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
f470: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
f480: 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
f490: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f4a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
f4b0: 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
f4c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
f4d0: 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
f4e0: 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
f4f0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
f500: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
f510: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
f520: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
f530: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
f540: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
f550: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
f560: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
f570: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
f580: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
f590: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
f5a0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
f5b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
f5c0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
f5d0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
f5e0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
f5f0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
f600: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
f610: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
f620: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
f630: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
f640: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
f650: 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
f660: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f670: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
f680: 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
f690: 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
f6a0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
f6b0: 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
f6c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f6d0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
f6e0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
f6f0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
f700: 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
f710: 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
f720: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
f730: 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
f740: 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
f750: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
f760: 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
f770: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
f780: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f790: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
f7a0: 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
f7b0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
f7c0: 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
f7d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f7e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
f7f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f800: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
f810: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
f820: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
f830: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
f840: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
f850: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
f860: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
f870: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
f880: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
f890: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
f8a0: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
f8b0: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
f8c0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
f8d0: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
f8e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
f8f0: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
f900: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
f910: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
f920: 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
f930: 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
f940: 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
f950: 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
f960: 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
f970: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
f980: 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
f990: 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
f9a0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
f9b0: 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
f9c0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
f9d0: 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
f9e0: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
f9f0: 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
fa00: 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
fa10: 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
fa20: 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
fa30: 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
fa40: 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
fa50: 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
fa60: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
fa70: 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
fa80: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
fa90: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
faa0: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
fab0: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
fac0: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
fad0: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
fae0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
faf0: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
fb00: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
fb10: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
fb20: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
fb30: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
fb40: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
fb50: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
fb60: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
fb70: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
fb80: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
fb90: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
fba0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
fbb0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
fbc0: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
fbd0: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
fbe0: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
fbf0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
fc00: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
fc10: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
fc20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
fc30: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
fc40: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
fc50: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
fc60: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
fc70: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
fc80: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
fc90: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
fca0: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
fcb0: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
fcc0: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
fcd0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
fce0: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
fcf0: 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
fd00: 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
fd10: 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
fd20: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
fd30: 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
fd40: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
fd50: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
fd60: 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
fd70: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
fd80: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
fd90: 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
fda0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
fdb0: 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
fdc0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
fdd0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
fde0: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
fdf0: 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
fe00: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
fe10: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
fe20: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
fe30: 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
fe40: 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
fe50: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
fe60: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
fe70: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
fe80: 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
fe90: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
fea0: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
feb0: 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
fec0: 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
fed0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
fee0: 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
fef0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
ff00: 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
ff10: 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
ff20: 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
ff30: 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
ff40: 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
ff50: 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
ff60: 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
ff70: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
ff80: 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
ff90: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
ffa0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
ffb0: 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
ffc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ffd0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ffe0: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
fff0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10000 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  Pg || !MEMDB );.
10010 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
10020 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
10030 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
10040 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10050 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
10060 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
10070 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
10080 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61  geSize, (u8*)aDa
10090 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
100a0 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
100b0 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
100c0 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a  journal").  ));.
100d0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
100e0 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64   ){.    isSynced
100f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e   = pPager->noSyn
10100 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c  c || (*pOffset <
10110 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
10120 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lHdr);.  }else{.
10130 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28      isSynced = (
10140 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
10150 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
10160 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20  _NEED_SYNC));.  
10170 7d 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  }.  if( (pPager-
10180 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
10190 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 69  CLUSIVE).   && i
101a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
101b0 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
101c0 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
101d0 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
101e0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
101f0 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
10200 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
10210 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
10220 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
10230 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
10240 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
10250 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
10260 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
10270 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
10280 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
10290 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
102a0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
102b0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
102c0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
102d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
102e0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
102f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
10300 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
10310 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
10320 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
10330 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
10340 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
10350 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
10360 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
10370 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
10380 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
10390 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
103a0 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
103b0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
103c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
103d0 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
103e0 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
103f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
10400 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
10410 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
10420 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
10430 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
10440 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
10450 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
10460 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
10470 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
10480 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
10490 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
104a0 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
104b0 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
104c0 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
104d0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
104e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
104f0 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
10500 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
10510 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
10520 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
10530 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
10540 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
10550 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
10560 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
10570 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
10580 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
10590 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
105a0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
105b0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
105c0 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
105d0 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
105e0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
105f0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
10600 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
10610 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
10620 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
10630 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
10640 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
10650 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
10660 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
10670 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
10680 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
10690 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
106a0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
106b0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
106c0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
106d0 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
106e0 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
106f0 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
10700 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
10710 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
10720 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
10730 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
10740 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
10750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10760 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
10770 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
10780 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
10790 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
107a0 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
107b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
107c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
107d0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
107e0 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
107f0 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
10800 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
10810 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
10820 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
10830 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
10840 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
10850 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
10860 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
10870 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
10880 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
10890 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
108a0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
108b0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
108c0 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
108d0 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
108e0 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
108f0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
10900 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
10910 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
10920 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
10930 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
10940 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
10950 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
10960 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
10970 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
10980 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
10990 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
109a0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
109b0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
109c0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
109d0 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
109e0 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
109f0 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
10a00 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
10a10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
10a20 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
10a30 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
10a40 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
10a50 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
10a60 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
10a70 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
10a80 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
10a90 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
10aa0 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
10ab0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
10ac0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
10ad0 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
10ae0 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
10af0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
10b00 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
10b10 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
10b20 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
10b30 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
10b40 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
10b50 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
10b60 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
10b70 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
10b80 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
10b90 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
10ba0 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
10bb0 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
10bc0 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
10bd0 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
10be0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
10bf0 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
10c00 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
10c10 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
10c20 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
10c30 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
10c40 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
10c50 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
10c60 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
10c70 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
10c80 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
10c90 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
10ca0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
10cb0 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
10cc0 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
10cd0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
10ce0 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
10cf0 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
10d00 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
10d10 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
10d20 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
10d30 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
10d40 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
10d50 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
10d60 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
10d70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
10d80 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
10d90 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
10da0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
10db0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
10dc0 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
10dd0 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
10de0 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
10df0 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
10e00 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
10e10 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
10e20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
10e30 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
10e40 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
10e50 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
10e60 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
10e70 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
10e80 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
10e90 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
10ea0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10eb0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
10ec0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
10ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
10ee0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
10ef0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
10f00 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
10f10 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
10f20 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
10f30 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
10f40 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
10f50 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
10f60 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
10f70 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
10f80 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
10f90 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
10fa0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
10fb0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
10fc0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
10fd0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
10fe0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
10ff0 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
11000 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
11010 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
11020 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
11030 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
11040 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
11050 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
11060 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
11070 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
11080 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
11090 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
110a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
110b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
110c0 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
110d0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
110e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
110f0 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
11100 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
11110 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
11120 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11130 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
11140 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
11150 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
11160 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
11170 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
11180 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
111a0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
111b0 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
111c0 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
111d0 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
111e0 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
111f0 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
11200 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
11210 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
11220 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11230 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
11240 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
11250 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
11260 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
11270 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
11280 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
11290 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
112a0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
112b0 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
112c0 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
112d0 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
112e0 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
112f0 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
11300 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
11310 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
11320 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
11330 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11340 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
11350 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
11360 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
11370 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
11380 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
11390 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
113a0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
113b0 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
113c0 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
113d0 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
113e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
113f0 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
11400 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
11410 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
11420 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
11430 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
11440 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11450 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
11460 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
11470 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
11480 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
11490 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
114a0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
114b0 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
114c0 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
114d0 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
114e0 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
114f0 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11500 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
11510 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
11520 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
11530 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
11540 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
11550 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
11560 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
11570 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
11580 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11590 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
115a0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
115b0 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
115c0 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
115d0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
115e0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
115f0 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
11600 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
11610 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
11620 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
11630 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
11640 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
11650 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
11660 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
11670 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
11680 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
11690 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
116a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
116b0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
116c0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
116d0 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
116e0 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
116f0 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
11700 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
11710 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
11720 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11730 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
11740 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
11750 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
11760 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11770 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
11780 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
11790 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
117a0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
117b0 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
117c0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
117d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
117e0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
117f0 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
11800 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
11810 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
11820 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
11830 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
11840 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11850 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
11860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
11880 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
11890 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
118a0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
118b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
118c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
118d0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
118e0 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
118f0 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
11900 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
11910 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
11920 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
11930 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
11940 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
11950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
11960 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
11970 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
11980 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
11990 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
119a0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
119b0 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
119c0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
119d0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
119e0 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
119f0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
11a00 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f  for both the pJo
11a10 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65  urnal and pMaste
11a20 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
11a30 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63  rs..  ** If succ
11a40 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65  essful, open the
11a50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11a60 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
11a70 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
11a80 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
11a90 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
11aa0 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46  Zero(pVfs->szOsF
11ab0 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
11ac0 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
11ad0 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
11ae0 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
11af0 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
11b00 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
11b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11b20 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
11b30 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
11b40 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
11b50 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
11b60 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
11b70 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  NAL);.    rc = s
11b80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
11b90 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73  s, zMaster, pMas
11ba0 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  ter, flags, 0);.
11bb0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
11bc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
11bd0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
11be0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
11bf0 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
11c00 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
11c10 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11c20 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
11c30 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
11c40 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
11c50 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
11c60 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
11c70 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
11c80 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
11c90 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
11ca0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a  >mxPathname+1;..
11cb0 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
11cc0 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
11cd0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
11ce0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
11cf0 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
11d00 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
11d10 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
11d20 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
11d30 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
11d40 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
11d50 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
11d60 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
11d70 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
11d80 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
11d90 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
11da0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11db0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
11dc0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
11dd0 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50    }.    zMasterP
11de0 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
11df0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
11e00 6e 61 6c 2b 31 5d 3b 0a 20 20 20 20 72 63 20 3d  nal+1];.    rc =
11e10 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
11e20 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
11e30 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
11e40 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
11e50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11e60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
11e70 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
11e80 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
11e90 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
11ea0 3d 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  = 0;..    zJourn
11eb0 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
11ec0 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
11ed0 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
11ee0 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
11ef0 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
11f00 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20    int exists;.  
11f10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11f20 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
11f30 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
11f40 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
11f50 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69  exists);.      i
11f60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11f70 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
11f80 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
11fa0 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
11fb0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
11fc0 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
11fd0 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
11fe0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
11ff0 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
12000 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
12010 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
12020 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12030 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
12040 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
12050 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
12060 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12070 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
12080 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
12090 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
120a0 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
120b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
120c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
120d0 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
120e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
120f0 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
12100 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
12110 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
12120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
12140 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12150 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
12160 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
12170 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
12180 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
12190 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
121a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
121b0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
121c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
121d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
121e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
121f0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
12200 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
12210 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
12220 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
12230 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
12240 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
12250 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
12260 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
12270 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
12280 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
12290 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
122a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
122b0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
122c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
122d0 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
122e0 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
122f0 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
12300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
12310 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
12320 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12330 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
12340 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
12350 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
12360 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12370 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
12380 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 70 4d  ;.  }  .  if( pM
12390 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
123a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
123b0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
123c0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
123d0 61 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  al) );.  }.  sql
123e0 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
123f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
12400 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
12410 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
12420 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61   to change the a
12430 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  ctual size of th
12440 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
12450 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
12460 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c  system. This onl
12470 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63  y happens when c
12480 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
12490 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72  saction,.** or r
124a0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
124b0 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75  ansaction (inclu
124c0 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63  ding rolling bac
124d0 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  k a hot-journal)
124e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ..**.** If the m
124f0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
12500 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
12510 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
12520 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65  ock is not.** he
12530 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
12540 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
12550 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
12560 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
12570 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6e  .** changed to n
12580 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67  Page pages (nPag
12590 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e*pPager->pageSi
125a0 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20 74 68  ze bytes). If th
125b0 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73  e file.** on dis
125c0 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c  k is currently l
125d0 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65  arger than nPage
125e0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65   pages, then use
125f0 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75   the VFS.** xTru
12600 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74  ncate() method t
12610 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a  o truncate it..*
12620 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68  *.** Or, it migh
12630 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
12640 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
12650 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
12660 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
12670 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
12680 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
12690 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
126a0 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
126b0 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
126c0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
126d0 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
126e0 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
126f0 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
12700 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
12710 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
12720 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
12730 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
12740 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
12750 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
12760 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
12770 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
12780 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
12790 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
127a0 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
127b0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
127c0 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
127d0 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
127e0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
127f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12800 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12810 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12820 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
12830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
12840 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
12850 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
12860 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
12870 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36 34 20  >fd) ){.    i64 
12880 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
12890 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  Size;.    /* TOD
128a0 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
128b0 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
128c0 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
128d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
128e0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
128f0 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
12900 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
12910 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
12920 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
12930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12940 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
12950 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
12960 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
12970 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
12980 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12990 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
129a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
129b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
129c0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
129d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
129e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20  pPager->fd, "", 
129f0 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20  1, newSize-1);. 
12a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12a20 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
12a30 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
12a40 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
12a50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12a60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
12a70 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
12a80 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
12a90 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
12aa0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
12ab0 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
12ac0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12ad0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
12ae0 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
12af0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
12b00 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
12b10 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
12b20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f  used used .** to
12b30 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
12b40 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
12b50 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
12b60 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
12b70 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
12b80 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
12b90 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
12ba0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
12bb0 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
12bc0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
12bd0 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
12be0 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
12bf0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
12c00 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
12c10 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
12c20 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
12c30 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
12c40 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
12c50 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
12c60 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
12c70 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
12c80 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
12c90 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
12ca0 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
12cb0 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
12cc0 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
12cd0 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73  ECTOR_SIZE..*/.s
12ce0 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
12cf0 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
12d00 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
12d10 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
12d20 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
12d30 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
12d40 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
12d50 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  pFile ){.    /* 
12d60 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
12d70 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
12d80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
12d90 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
12da0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
12db0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
12dc0 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
12dd0 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
12de0 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
12df0 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a   will segfault..
12e00 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
12e10 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
12e20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
12e30 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
12e40 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
12e50 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32  r->sectorSize<32
12e60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12e70 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
12e80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
12e90 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d  er->sectorSize>M
12ea0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
12eb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
12ec0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
12ed0 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  12 );.    pPager
12ee0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d  ->sectorSize = M
12ef0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
12f00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
12f10 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
12f20 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
12f30 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
12f40 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
12f50 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
12f60 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
12f70 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
12f80 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
12f90 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
12fa0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
12fb0 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
12fc0 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
12fd0 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
12fe0 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
12ff0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
13000 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13010 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
13020 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
13030 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
13040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
13050 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
13060 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
13070 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
13080 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
13090 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
130a0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
130b0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
130c0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
130d0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
130e0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
130f0 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
13100 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
13110 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
13120 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
13130 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
13140 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
13150 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
13160 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
13170 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
13180 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
13190 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
131a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
131b0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
131c0 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
131d0 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
131e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
131f0 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
13200 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
13210 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
13220 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
13230 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
13240 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
13250 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
13260 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
13270 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
13280 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
13290 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
132a0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
132b0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
132c0 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
132d0 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
132e0 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
132f0 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
13300 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
13310 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
13320 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
13330 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
13340 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
13350 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
13360 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
13370 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
13380 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
13390 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
133a0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
133b0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
133c0 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
133d0 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
133e0 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
133f0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
13400 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
13410 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
13420 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
13430 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
13440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13450 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
13460 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
13470 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
13480 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
13490 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
134a0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
134b0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
134c0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
134d0 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
134e0 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
134f0 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
13500 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
13510 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
13520 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
13530 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
13540 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
13550 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
13560 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
13570 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
13580 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
13590 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
135a0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
135b0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
135c0 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
135d0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
135e0 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
135f0 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
13600 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
13610 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
13620 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
13630 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
13640 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
13650 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
13660 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
13670 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
13680 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
13690 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
136a0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
136b0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
136c0 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
136d0 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
136e0 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
136f0 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
13700 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
13710 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
13720 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
13730 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
13740 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13750 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
13760 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
13770 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
13780 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
13790 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
137a0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
137b0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
137c0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
137d0 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
137e0 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
137f0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
13800 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
13810 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
13820 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
13830 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
13840 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
13850 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
13860 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
13870 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
13880 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
13890 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
138a0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
138b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
138c0 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
138d0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
138e0 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
138f0 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
13900 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
13910 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
13920 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
13930 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
13940 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
13950 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
13960 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
13970 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
13980 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
13990 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
139a0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
139b0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
139c0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
139d0 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
139e0 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
139f0 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
13a00 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
13a10 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
13a20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
13a30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13a40 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
13a50 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
13a60 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
13a70 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
13a80 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
13a90 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
13aa0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
13ab0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13ac0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
13ad0 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
13ae0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13af0 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
13b00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
13b10 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
13b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
13b30 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
13b40 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
13b50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
13b60 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
13b70 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
13b80 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
13b90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
13ba0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
13bb0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
13bc0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
13bd0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
13be0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13bf0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
13c00 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
13c10 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
13c20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13c30 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
13c40 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
13c50 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
13c60 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
13c70 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
13c80 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
13c90 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
13ca0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
13cb0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
13cc0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
13cd0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
13ce0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
13cf0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
13d00 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13d10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13d20 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
13d30 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13d40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
13d50 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
13d60 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
13d70 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
13d80 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
13d90 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
13da0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
13db0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
13dc0 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
13dd0 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
13de0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13df0 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
13e00 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
13e10 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
13e20 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
13e30 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
13e40 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
13e50 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
13e60 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
13e70 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
13e80 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
13e90 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
13ea0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
13eb0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
13ec0 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
13ed0 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
13ee0 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
13ef0 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
13f00 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
13f10 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
13f20 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
13f30 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
13f40 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
13f50 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
13f60 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
13f70 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
13f80 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
13f90 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
13fa0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
13fb0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
13fc0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
13fd0 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
13fe0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
13ff0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
14000 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
14010 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
14020 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
14030 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
14040 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
14050 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
14060 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
14070 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
14080 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
14090 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
140a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
140b0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
140c0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
140d0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
140e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
140f0 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
14100 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
14110 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
14120 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
14130 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
14140 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
14150 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
14160 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
14170 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
14180 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
14190 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
141a0 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
141b0 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65  ( 1 ){.    /* Re
141c0 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
141d0 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
141e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
141f0 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
14200 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
14210 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
14220 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14230 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
14240 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
14250 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
14260 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
14270 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
14280 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
14290 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
142a0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
142b0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
142c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
142d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
142e0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
142f0 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
14300 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
14310 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14320 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
14330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14340 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
14350 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
14370 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
14380 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14390 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
143a0 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
143b0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
143c0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
143d0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
143e0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
143f0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
14400 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
14410 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
14420 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
14430 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
14440 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
14450 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
14460 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
14470 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
14480 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
14490 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
144a0 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
144b0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
144c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
144d0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
144e0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
144f0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
14500 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
14510 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
14520 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
14530 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
14540 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
14550 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
14560 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
14570 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14580 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
14590 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
145a0 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
145b0 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
145c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
145d0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
145e0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
145f0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
14600 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
14610 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
14620 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
14630 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
14640 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
14650 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
14660 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
14670 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
14680 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
14690 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
146a0 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
146b0 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
146c0 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
146d0 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
146e0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
146f0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
14700 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
14710 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
14720 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
14730 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
14740 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
14750 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
14760 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
14770 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
14780 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
14790 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
147a0 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
147b0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
147c0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
147d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
147e0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
147f0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
14800 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
14810 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
14820 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
14830 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
14840 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
14850 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
14860 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14870 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
14880 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
14890 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
148a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
148b0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
148c0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
148d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
148e0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
148f0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
14900 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14910 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
14920 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
14930 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
14940 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
14950 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
14960 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
14970 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
14980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
14990 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
149a0 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
149b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
149c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
149d0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
149e0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
149f0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
14a00 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
14a10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14a30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
14a40 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
14a50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
14a60 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
14a70 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
14a80 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
14a90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
14aa0 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
14ab0 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
14ac0 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
14ad0 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
14ae0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
14af0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
14b00 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
14b10 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
14b20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
14b30 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
14b40 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
14b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14b60 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
14b70 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
14b80 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
14b90 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
14ba0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14bc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14bd0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14be0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14bf0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
14c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14c10 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
14c20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14c30 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
14c40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
14c50 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
14c60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
14c70 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
14c80 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
14c90 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
14ca0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
14cb0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
14cc0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
14cd0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
14ce0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
14cf0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
14d00 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
14d10 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
14d20 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
14d30 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
14d40 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
14d50 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
14d60 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
14d70 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
14d80 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
14d90 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
14da0 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
14db0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
14dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
14dd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14de0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
14df0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
14e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e10 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
14e20 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
14e30 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
14e40 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
14e50 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
14e60 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
14e70 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
14e80 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
14e90 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
14ea0 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
14eb0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
14ec0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
14ed0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
14ee0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
14ef0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
14f00 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
14f10 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
14f20 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
14f30 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
14f40 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
14f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
14f70 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
14f80 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
14f90 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
14fa0 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
14fb0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
14fc0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
14fd0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
14fe0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
14ff0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
15000 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
15010 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
15020 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
15030 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
15040 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
15050 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
15060 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
15070 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
15080 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
15090 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
150a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
150b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d  .    pPager->fd-
150c0 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a  >pMethods==0 ||.
150d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
150e0 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
150f0 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
15100 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
15110 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b  >=SQLITE_OK.  );
15120 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
15130 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
15140 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
15150 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
15160 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
15170 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
15180 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
15190 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
151a0 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
151b0 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
151c0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
151d0 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
151e0 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
151f0 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
15200 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
15210 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
15220 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
15230 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
15240 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
15250 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
15260 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
15270 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
15280 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
15290 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
152a0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
152b0 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
152c0 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
152d0 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
152e0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
152f0 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
15300 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
15310 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
15320 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
15330 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
15340 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
15350 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
15360 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
15370 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
15380 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
15390 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
153a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
153b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
153c0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
153d0 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
153e0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
153f0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
15400 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
15410 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
15420 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
15430 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
15440 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
15450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15460 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
15470 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  0 && pPager->sta
15480 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
15490 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
154a0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
154b0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
154c0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
154d0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
154e0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
154f0 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70  ->noSync==0 && p
15500 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
15510 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
15520 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15530 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
15540 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
15550 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69  _flags);.  }.  i
15560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15570 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
15580 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
15590 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
155a0 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20  er[0]!='\0');.  
155b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
155c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
155d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
155e0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
155f0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
15600 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
15610 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
15620 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
15630 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
15640 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
15650 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
15660 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
15670 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
15680 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
15690 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
156a0 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
156b0 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
156c0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
156d0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
156e0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
156f0 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
15700 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
15710 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
15720 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
15730 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
15740 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
15750 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
15760 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
15770 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
15780 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
15790 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
157a0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
157b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
157c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
157d0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
157e0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
157f0 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
15800 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
15810 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
15820 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
15830 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
15840 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
15850 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
15860 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
15870 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
15880 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
15890 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
158a0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
158b0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
158c0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
158d0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
158e0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
158f0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
15900 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15910 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
15920 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
15930 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
15940 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
15950 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15960 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
15970 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
15980 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
15990 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
159a0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
159b0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
159c0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
159d0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
159e0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
159f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
15a00 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
15a10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15a20 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
15a30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
15a40 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 6f  /* Byte offset o
15a70 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20 66  f file to read f
15a80 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  rom */.  int isI
15a90 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nWal = 0;       
15aa0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15ab0 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20   page is in log 
15ac0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
15ad0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
15ae0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26  >=PAGER_SHARED &
15af0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
15b00 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
15b10 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
15b20 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
15b30 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
15b40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15b50 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
15b60 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
15b70 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
15b80 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
15b90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15ba0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OK;.  }..  if( p
15bb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
15bc0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  r) ){.    /* Try
15bd0 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67   to pull the pag
15be0 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65  e from the write
15bf0 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20  -ahead log. */. 
15c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
15c10 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70  alRead(pPager->p
15c20 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e  Wal, pgno, &isIn
15c30 57 61 6c 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  Wal, pPg->pData)
15c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
15c50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73  SQLITE_OK && !is
15c60 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 4f 66  InWal ){.    iOf
15c70 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
15c80 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
15c90 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
15ca0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
15cb0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
15cc0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
15cd0 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29  geSize, iOffset)
15ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15cf0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15d00 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
15d10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15d20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
15d30 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
15d40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
15d50 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
15d60 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
15d70 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
15d80 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
15d90 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
15da0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
15db0 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
15dc0 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
15dd0 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
15de0 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
15df0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
15e00 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
15e10 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
15e20 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
15e30 6f 2e 20 20 42 79 74 65 73 20 33 32 2e 2e 33 35  o.  Bytes 32..35
15e40 20 61 6e 64 20 33 35 2e 2e 33 39 20 73 68 6f 75   and 35..39 shou
15e50 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
15e60 72 73 20 77 68 69 63 68 20 61 72 65 0a 20 20 20  rs which are.   
15e70 20 20 20 2a 2a 20 6e 65 76 65 72 20 30 78 66 66     ** never 0xff
15e80 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
15e90 69 6e 67 20 70 50 61 67 65 72 2d 3e 64 62 46 69  ing pPager->dbFi
15ea0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
15eb0 6c 20 30 78 66 66 0a 20 20 20 20 20 20 2a 2a 20  l 0xff.      ** 
15ec0 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
15ed0 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
15ee0 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
15ef0 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
15f00 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
15f10 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
15f20 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
15f30 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
15f40 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
15f50 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
15f60 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
15f70 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
15f80 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
15f90 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
15fa0 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
15fb0 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
15fc0 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
15fd0 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
15fe0 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
15ff0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
16000 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
16010 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
16020 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
16030 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
16040 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
16050 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
16060 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
16070 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
16080 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
16090 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
160a0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
160b0 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
160c0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
160d0 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
160e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
160f0 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
16100 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
16110 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
16120 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
16130 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
16140 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
16150 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
16160 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
16170 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
16180 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
16190 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
161a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
161b0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
161c0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
161d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
161e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
161f0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20  tion is invoked 
16200 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
16210 67 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ge that has alre
16220 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69  ady been .** wri
16230 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f  tten into the lo
16240 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41  g file when a WA
16250 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
16260 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
16270 20 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69   Parameter iPg i
16280 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
16290 72 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20  r of said page. 
162a0 54 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e  The pCtx argumen
162b0 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c  t .** is actuall
162c0 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  y a pointer to t
162d0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
162e0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  re..**.** If pag
162f0 65 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74  e iPg is present
16300 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61   in the cache, a
16310 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  nd has no outsta
16320 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
16330 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61  ,.** it is disca
16340 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rded. Otherwise,
16350 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
16360 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61  e or more outsta
16370 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e  nding.** referen
16380 63 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f  ces, the page co
16390 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65  ntent is reloade
163a0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
163b0 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61  ase. If the.** a
163c0 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64  ttempt to reload
163d0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
163e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  e database is re
163f0 71 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73  quired and fails
16400 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  , .** return an 
16410 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
16420 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
16430 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
16440 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f  ic int pagerUndo
16450 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
16460 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a  Ctx, Pgno iPg){.
16470 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16480 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
16490 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a  Pager = (Pager *
164a0 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a  )pCtx;.  PgHdr *
164b0 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20 73 71  pPg;..  pPg = sq
164c0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
164d0 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
164e0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
164f0 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
16500 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
16510 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
16520 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
16530 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
16540 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
16550 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
16560 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16580 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
16590 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
165a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
165b0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
165c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
165d0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
165e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
165f0 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
16600 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
16610 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
16620 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
16630 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
16640 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
16650 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
16660 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
16670 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
16680 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
16690 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
166a0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
166b0 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
166c0 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
166d0 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
166e0 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
166f0 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
16700 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
16710 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
16720 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
16730 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
16740 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
16750 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
16760 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
16770 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
16780 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
16790 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
167a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
167b0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
167c0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
167d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
167e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
167f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
16800 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
16810 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
16820 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
16830 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
16840 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
16850 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
16860 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
16870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16880 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
16890 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
168b0 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
168c0 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
168d0 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
168e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
168f0 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
16900 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
16910 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
16920 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
16930 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
16940 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
16950 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
16960 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
16970 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
16980 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
16990 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
169a0 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
169b0 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
169c0 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
169d0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
169e0 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
169f0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
16a00 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
16a10 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
16a20 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
16a30 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
16a40 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
16a50 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
16a60 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
16a70 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
16a80 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
16a90 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
16aa0 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
16ab0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
16ac0 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
16ad0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
16ae0 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
16af0 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
16b00 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
16b10 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
16b20 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
16b30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16b40 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
16b50 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
16b60 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
16b70 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
16b80 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
16b90 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
16ba0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
16bb0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
16bc0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
16bd0 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
16be0 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
16bf0 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
16c00 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
16c10 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
16c20 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
16c30 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
16c40 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
16c50 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
16c60 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
16c70 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
16c80 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
16c90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
16ca0 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
16cb0 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
16cc0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
16cd0 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
16ce0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
16cf0 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
16d00 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
16d10 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
16d20 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
16d30 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
16d40 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
16d50 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
16d60 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
16d70 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
16d80 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
16d90 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
16da0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
16db0 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
16dc0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
16dd0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
16de0 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
16df0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
16e00 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
16e10 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
16e20 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
16e30 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
16e40 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
16e50 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
16e60 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
16e70 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
16e80 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
16e90 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
16ea0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
16eb0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
16ec0 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
16ed0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
16ee0 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
16ef0 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
16f00 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
16f10 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
16f20 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
16f30 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
16f40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
16f50 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
16f60 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
16f70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
16f80 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
16f90 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
16fa0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
16fb0 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
16fc0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
16fd0 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
16fe0 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
16ff0 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
17000 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
17010 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
17020 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
17030 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
17040 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
17050 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
17060 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
17070 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
17080 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
17090 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
170a0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
170b0 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
170c0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
170d0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
170e0 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
170f0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
17100 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
17110 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
17120 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
17130 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
17140 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
17150 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
17160 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
17170 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
17180 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
17190 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
171a0 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
171b0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
171c0 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
171d0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
171e0 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
171f0 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
17200 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
17210 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
17220 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
17230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17240 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
17250 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
17260 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
17270 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
17280 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
17290 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
172a0 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
172b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
172c0 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
172d0 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
172e0 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
172f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17300 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
17310 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
17320 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
17330 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
17340 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
17350 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
17360 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
17370 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
17380 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
17390 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
173a0 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
173b0 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
173c0 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
173d0 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
173e0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
173f0 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
17400 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
17410 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
17420 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
17430 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
17440 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
17450 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17460 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
17470 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
17480 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
17490 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
174a0 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
174b0 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
174c0 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
174d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
174e0 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
174f0 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
17500 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
17510 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
17520 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
17530 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
17540 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
17550 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
17560 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
17570 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
17580 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
17590 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
175a0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
175b0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
175c0 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
175d0 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
175e0 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
175f0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
17600 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
17610 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
17620 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
17630 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
17640 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
17650 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
17660 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
17670 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
17680 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
17690 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
176a0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
176b0 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
176c0 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
176d0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
176e0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
176f0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
17700 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
17710 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
17720 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
17730 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
17740 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
17750 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
17760 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
17770 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
17780 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
17790 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
177a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
177b0 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
177c0 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
177d0 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
177e0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
177f0 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
17800 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
17810 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
17820 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
17830 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
17840 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
17850 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
17860 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
17870 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
17880 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
17890 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
178a0 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
178b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
178c0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
178d0 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
178e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
178f0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
17900 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
17910 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
17920 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
17930 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
17940 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
17950 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
17960 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
17970 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
17980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
179a0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
179b0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
179c0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
179d0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
179e0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
179f0 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
17a00 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
17a10 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
17a20 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
17a30 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
17a40 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
17a50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
17a60 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
17a70 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
17a80 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
17a90 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
17aa0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
17ab0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
17ac0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
17ad0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
17ae0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
17af0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
17b00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
17b10 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
17b20 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
17b30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
17b40 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
17b50 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
17b60 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
17b70 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
17b80 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
17b90 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
17ba0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
17bb0 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
17bc0 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
17bd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
17be0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
17bf0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
17c00 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
17c10 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
17c20 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
17c30 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
17c40 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
17c50 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
17c60 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
17c70 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
17c80 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
17c90 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
17ca0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
17cb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
17cc0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
17cd0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
17ce0 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
17cf0 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
17d00 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
17d10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
17d20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
17d30 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
17d40 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
17d50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
17d60 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
17d70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
17d80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
17d90 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
17da0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
17db0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
17dc0 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
17dd0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
17de0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
17df0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
17e00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
17e10 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
17e20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a  ->journalOff==sz
17e30 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
17e40 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
17e50 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
17e60 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
17e70 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
17e80 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
17e90 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
17ea0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
17eb0 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
17ec0 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
17ed0 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
17ee0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
17ef0 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
17f00 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
17f10 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
17f20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
17f30 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
17f40 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
17f50 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e  fset = pSavepoin
17f60 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
17f70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17f80 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
17f90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
17fa0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17fb0 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
17fc0 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
17fd0 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 46  , pSavepoint->iF
17fe0 72 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rame);.    }.   
17ff0 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
18000 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
18010 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
18020 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
18030 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
18040 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69  ssert( offset==i
18050 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
18060 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
18070 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
18080 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
18090 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
180a0 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
180b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
180c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
180d0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
180e0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
180f0 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
18100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18110 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18120 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
18130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18140 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
18150 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
18160 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
18170 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
18180 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
18190 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
181a0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
181b0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
181c0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
181d0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
181e0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
181f0 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
18200 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
18210 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
18220 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
18230 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
18240 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
18250 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
18260 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
18270 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
18280 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
18290 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
182a0 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
182b0 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
182c0 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
182d0 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
182e0 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
182f0 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
18300 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
18310 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
18320 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
18330 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
18340 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
18350 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
18360 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
18370 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
18390 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
183a0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
183b0 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
183c0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
183d0 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
183e0 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
183f0 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
18400 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
18410 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
18420 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
18430 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
18440 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
18450 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
18460 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
18470 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
18480 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
18490 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
184a0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
184b0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
184c0 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
184d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
184e0 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
184f0 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
18500 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
18510 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
18520 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
18530 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
18540 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
18550 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
18560 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
18570 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
18580 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
18590 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
185a0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
185b0 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
185c0 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
185d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
185e0 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
185f0 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
18600 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
18610 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
18620 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
18630 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
18640 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
18650 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
18670 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
18680 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
18690 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
186a0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
186b0 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
186c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
186d0 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
186e0 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
186f0 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
18700 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18710 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
18720 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
18730 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
18740 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
18750 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
18760 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20   bFullFsync){.  
18770 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
18780 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
18790 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
187a0 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
187b0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
187c0 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
187d0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
187e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
187f0 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46  _flags = (bFullF
18800 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
18810 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
18820 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
18830 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
18840 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
18850 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
18860 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
18870 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
18880 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
18890 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
188a0 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
188b0 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
188c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
188d0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
188e0 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
188f0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
18900 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
18910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
18920 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
18930 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
18940 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
18950 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
18960 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57  ry file..**.** W
18970 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
18980 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70  scriptor into *p
18990 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c  File. Return SQL
189a0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
189b0 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  s .** or some ot
189c0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
189d0 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
189e0 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
189f0 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20  ally .** delete 
18a00 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
18a10 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  le when it is cl
18a20 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
18a30 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20  flags passed to 
18a40 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f  the VFS layer xO
18a50 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74  pen() call are t
18a60 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a  hose specified.*
18a70 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76  * by parameter v
18a80 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74  fsFlags ORed wit
18a90 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  h the following:
18aa0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
18ab0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18ac0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
18ad0 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20  PEN_CREATE.**   
18ae0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
18af0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53  CLUSIVE.**     S
18b00 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
18b10 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74  EONCLOSE.*/.stat
18b20 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
18b30 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70  temp(.  Pager *p
18b40 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
18b50 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   The pager objec
18b60 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  t */.  sqlite3_f
18b70 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20  ile *pFile,  /* 
18b80 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
18b90 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a  escriptor here *
18ba0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
18bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
18bc0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
18bd0 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a  h to the VFS */.
18be0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
18bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
18c00 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  turn code */..#i
18c10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
18c20 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
18c30 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
18c40 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
18c50 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
18c60 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  nly */.#endif.. 
18c70 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51   vfsFlags |=  SQ
18c80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
18c90 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
18ca0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
18cb0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18cc0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
18cd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
18ce0 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
18cf0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
18d00 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
18d10 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
18d20 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
18d30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
18d40 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
18d50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18d60 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
18d70 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
18d80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
18d90 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
18da0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
18db0 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
18dc0 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
18dd0 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
18de0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
18df0 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
18e00 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
18e10 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
18e20 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
18e30 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
18e40 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
18e50 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
18e60 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
18e70 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
18e80 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
18e90 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
18ea0 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
18eb0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
18ec0 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
18ed0 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
18ee0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
18ef0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
18f00 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
18f10 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
18f20 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
18f30 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
18f40 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
18f50 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
18f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
18f90 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
18fa0 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
18fb0 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
18fc0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
18fd0 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
18fe0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
18ff0 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
19000 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
19010 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
19020 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
19030 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
19040 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
19050 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
19060 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
19070 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
19080 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
19090 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
190a0 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
190b0 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
190c0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
190d0 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
190e0 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
190f0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
19100 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
19110 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
19120 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
19150 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
19160 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
19170 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
19180 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
19190 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
191a0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
191b0 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
191c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
191d0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
191e0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
191f0 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78  ){  .  pPager->x
19200 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
19210 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
19220 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
19230 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
19240 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  dlerArg;.}../*.*
19250 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
19260 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
19270 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
19280 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
19290 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
192a0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
192b0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
192c0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
192d0 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
192e0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
192f0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
19300 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
19310 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
19320 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
19330 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
19340 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
19370 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
19380 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
19390 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
193a0 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
193b0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
193c0 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
193d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
193e0 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  ge the page size
193f0 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67   used by the Pag
19400 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e  er object. The n
19410 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a  ew page size .**
19420 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70   is passed in *p
19430 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
19440 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
19450 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
19460 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
19470 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
19480 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f   it.** is a no-o
19490 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  p. The value ret
194a0 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72  urned is the err
194b0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
194c0 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e  ode (i.e. .** on
194d0 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52  e of SQLITE_IOER
194e0 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
194f0 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  T or SQLITE_FULL
19500 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
19510 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
19520 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
19530 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
19540 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
19550 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
19560 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
19570 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
19580 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
19590 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
195a0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
195b0 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
195c0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
195d0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
195e0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
195f0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
19600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
19610 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
19620 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19630 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
19640 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
19650 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
19660 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
19670 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
19680 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
19690 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
196a0 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
196b0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
196c0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
196d0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
196e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
196f0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
19700 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
19710 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
19720 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
19730 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
19740 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
19750 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
19760 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
19770 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
19780 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
19790 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
197a0 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
197b0 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
197c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
197d0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
197e0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
197f0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
19800 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
19810 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
19820 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
19830 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
19840 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
19850 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
19860 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
19870 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
19880 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
19890 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
198a0 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
198b0 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
198c0 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
198d0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
198e0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
198f0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
19900 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
19910 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19920 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c   u16 *pPageSize,
19930 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
19940 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
19950 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
19960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19970 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
19980 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
19990 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
199a0 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
199b0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
199c0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
199d0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
199e0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  );.    if( (pPag
199f0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
19a00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
19a10 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  0).     && sqlit
19a20 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
19a30 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
19a40 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61  )==0 .     && pa
19a50 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
19a60 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
19a70 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Size .    ){.   
19a80 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
19a90 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
19aa0 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
19ab0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
19ac0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
19ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19ae0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
19af0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
19b00 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
19b10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
19b20 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
19b30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19b40 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
19b50 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
19b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
19b70 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
19b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
19b90 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
19ba0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
19bb0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
19bc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
19bd0 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  pPageSize = (u16
19be0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
19bf0 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  e;.    if( nRese
19c00 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
19c10 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
19c20 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
19c30 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
19c40 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
19c50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
19c60 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
19c70 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
19c80 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
19c90 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
19ca0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19cb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19cc0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
19cd0 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
19ce0 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
19cf0 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
19d00 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
19d10 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
19d20 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
19d30 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
19d40 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
19d50 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
19d60 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
19d70 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
19d80 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
19d90 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
19da0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
19db0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
19dc0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
19dd0 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
19de0 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
19df0 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
19e00 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
19e10 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
19e20 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
19e30 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
19e40 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
19e50 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
19e60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
19e70 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
19e80 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
19e90 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
19ea0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
19eb0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
19ec0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
19ed0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
19ee0 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
19ef0 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
19f00 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
19f10 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
19f20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
19f30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
19f40 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
19f50 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
19f60 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
19f70 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
19f80 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
19f90 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
19fa0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
19fb0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ge){.  int nPage
19fc0 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  ;.  if( mxPage>0
19fd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
19fe0 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
19ff0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
1a000 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1a010 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1a020 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a030 6d 78 50 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b  mxPgno>=nPage );
1a040 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1a050 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
1a060 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1a070 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
1a080 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
1a090 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
1a0a0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
1a0b0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
1a0c0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
1a0d0 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
1a0e0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
1a0f0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
1a100 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1a110 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
1a120 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
1a130 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
1a140 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
1a150 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
1a160 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
1a170 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
1a180 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1a190 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
1a1a0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
1a1b0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
1a1c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1a1d0 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
1a1e0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
1a1f0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
1a200 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1a210 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
1a220 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
1a230 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
1a240 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1a250 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
1a260 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
1a270 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1a280 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
1a290 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
1a2a0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
1a2b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1a2c0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1a2d0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
1a2e0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
1a2f0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1a300 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
1a310 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
1a320 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
1a330 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1a340 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
1a350 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
1a360 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
1a370 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1a380 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
1a390 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
1a3a0 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
1a3b0 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
1a3c0 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
1a3d0 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
1a3e0 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
1a3f0 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
1a400 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
1a410 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
1a420 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
1a430 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
1a440 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
1a450 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
1a460 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
1a470 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
1a480 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
1a490 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
1a4a0 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
1a4b0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
1a4c0 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
1a4d0 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
1a4e0 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
1a4f0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1a500 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
1a510 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
1a520 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a530 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
1a540 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
1a550 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
1a560 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
1a570 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1a580 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
1a590 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
1a5a0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
1a5b0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
1a5c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1a5d0 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
1a5e0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
1a5f0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1a600 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1a610 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1a620 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
1a630 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1a640 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
1a650 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
1a660 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
1a670 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1a680 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
1a690 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
1a6a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1a6b0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1a6c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1a6d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a6e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a6f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a700 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1a710 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1a720 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1a730 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
1a740 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61  th pPager. Norma
1a750 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c  lly, this is cal
1a760 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20  culated as (<db 
1a770 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65  file size>/<page
1a780 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65  -size>)..** Howe
1a790 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
1a7a0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
1a7b0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
1a7c0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
1a7d0 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
1a7e0 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
1a7f0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1a800 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
1a810 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
1a820 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1a830 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
1a840 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61  the.** error sta
1a850 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1a860 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1a870 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61  nPage left uncha
1a880 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20  nged. Or,.** if 
1a890 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
1a8a0 68 61 73 20 74 6f 20 62 65 20 71 75 65 72 69 65  has to be querie
1a8b0 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  d for the size o
1a8c0 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a  f the file and.*
1a8d0 2a 20 74 68 65 20 71 75 65 72 79 20 61 74 74 65  * the query atte
1a8e0 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49  mpt returns an I
1a8f0 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20  O error, the IO 
1a900 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a910 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
1a920 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
1a930 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  changed..**.** O
1a940 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 65  therwise, if eve
1a950 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
1a960 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49  ssful, then SQLI
1a970 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1a980 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65  d.** and *pnPage
1a990 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1a9a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1a9b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
1a9c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1a9d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1a9e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1a9f0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
1aa00 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20   nPage = 0;     
1aa10 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
1aa20 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
1aa30 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65  Page */..  /* De
1aa40 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62  termine the numb
1aa50 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
1aa60 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74  he file. Store t
1aa70 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f  his in nPage. */
1aa80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1aa90 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20  bSizeValid ){.  
1aaa0 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72    nPage = pPager
1aab0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73  ->dbSize;.  }els
1aac0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  e{.    int rc;  
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aae0 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64  * Error returned
1aaf0 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29   by OsFileSize()
1ab00 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   */.    i64 n = 
1ab10 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ab20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20  /* File size in 
1ab30 62 79 74 65 73 20 72 65 74 75 72 6e 65 64 20 62  bytes returned b
1ab40 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
1ab50 2f 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  /..    if( pager
1ab60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1ab70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
1ab80 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d  alDbsize(pPager-
1ab90 3e 70 57 61 6c 2c 20 26 6e 50 61 67 65 29 3b 0a  >pWal, &nPage);.
1aba0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
1abb0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1abc0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1abd0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1abe0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1abf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  );.      if( isO
1ac00 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ac10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  ){.        if( S
1ac20 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
1ac30 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1ac40 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
1ac50 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
1ac60 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1ac70 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1ac80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ac90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1aca0 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
1acb0 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
1acc0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ize ){.        n
1acd0 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
1ace0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
1acf0 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20  Page = (Pgno)(n 
1ad00 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  / pPager->pageSi
1ad10 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
1ad20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
1ad30 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1ad40 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
1ad50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1ad60 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
1ad70 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1ad80 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
1ad90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
1ada0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  lid = 1;.    }. 
1adb0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1adc0 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f  current number o
1add0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
1ade0 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ile is greater t
1adf0 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f  han the .  ** co
1ae00 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
1ae10 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
1ae20 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
1ae30 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
1ae40 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
1ae50 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
1ae60 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
1ae70 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
1ae80 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
1ae90 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
1aea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
1aeb0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
1aec0 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ble and return S
1aed0 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70  QLITE_OK */.  *p
1aee0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1aef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1af00 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  K;.}.../*.** Try
1af10 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
1af20 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
1af30 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
1af40 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
1af50 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
1af60 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
1af70 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
1af80 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1af90 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
1afa0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
1afb0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
1afc0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
1afd0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
1afe0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
1aff0 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
1b000 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
1b010 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
1b020 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
1b030 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
1b040 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
1b050 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
1b060 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
1b070 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
1b080 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
1b090 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
1b0a0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
1b0b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1b0c0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
1b0d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
1b0e0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
1b0f0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
1b100 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
1b110 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
1b120 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
1b130 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
1b140 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
1b150 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1b160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b170 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
1b180 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1b190 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
1b1a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1b1d0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
1b1e0 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
1b1f0 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
1b200 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
1b210 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
1b220 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
1b230 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
1b240 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1b250 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
1b260 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
1b270 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
1b280 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
1b290 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
1b2a0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1b2b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
1b2c0 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
1b2d0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
1b2e0 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d 75  nown. It.  ** mu
1b2f0 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  st not have been
1b300 20 6d 6f 64 69 66 69 65 64 20 61 74 20 74 68 69   modified at thi
1b310 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20  s point..  */.  
1b320 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b330 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1b340 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
1b350 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b  bSizeValid==0 );
1b360 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1b370 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1b380 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
1b390 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
1b3a0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
1b3b0 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
1b3c0 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
1b3d0 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
1b3e0 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
1b3f0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72  already held, or
1b400 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
1b410 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68  sistions that th
1b420 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
1b430 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
1b440 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
1b450 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
1b460 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
1b470 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1b480 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
1b490 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
1b4a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
1b4b0 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
1b4c0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
1b4d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20  PAGER_UNLOCK && 
1b4e0 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
1b4f0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
1b500 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  | (pPager->state
1b510 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
1b520 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
1b530 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
1b540 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1b550 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
1b560 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
1b570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1b580 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
1b590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b5a0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1b5b0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
1b5c0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
1b5d0 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
1b5e0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
1b5f0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
1b600 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20  dlerArg) );.    
1b610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b620 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
1b630 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c  r->state = (u8)l
1b640 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
1b650 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
1b660 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1b670 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
1b680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
1b6a0 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
1b6b0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
1b6c0 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
1b6d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
1b6e0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
1b6f0 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
1b700 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
1b710 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
1b720 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
1b730 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1b740 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1b750 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
1b760 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
1b770 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
1b780 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
1b790 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
1b7a0 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
1b7b0 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
1b7c0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
1b7d0 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
1b7e0 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
1b7f0 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
1b800 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
1b810 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
1b820 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
1b830 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
1b840 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
1b850 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
1b860 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
1b870 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
1b880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
1b890 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
1b8a0 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
1b8b0 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
1b8c0 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
1b8d0 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
1b8e0 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
1b8f0 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
1b900 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
1b910 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1b920 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
1b930 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
1b940 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
1b950 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
1b960 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
1b970 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
1b980 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
1b990 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
1b9a0 75 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  ur would be to r
1b9b0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
1b9c0 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
1b9d0 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
1b9e0 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
1b9f0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
1ba00 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
1ba10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1ba20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
1ba30 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
1ba40 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
1ba50 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
1ba60 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
1ba70 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
1ba80 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
1ba90 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
1baa0 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
1bab0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
1bac0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
1bad0 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
1bae0 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
1baf0 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
1bb00 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
1bb10 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
1bb20 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1bb30 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1bb40 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
1bb50 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
1bb60 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1bb70 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
1bb80 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
1bb90 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
1bba0 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
1bbb0 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
1bbc0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1bbd0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
1bbe0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1bbf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1bc00 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
1bc10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
1bc20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
1bc30 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
1bc40 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
1bc50 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
1bc60 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
1bc70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
1bc80 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
1bc90 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
1bca0 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
1bcb0 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
1bcc0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
1bcd0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
1bce0 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
1bcf0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
1bd00 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
1bd10 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
1bd20 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
1bd30 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
1bd40 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
1bd50 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
1bd60 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
1bd70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
1bd80 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  mmitted..*/.void
1bd90 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1bda0 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
1bdb0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
1bdc0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
1bdd0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
1bde0 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74  alid );.  assert
1bdf0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1be00 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
1be10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1be20 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1be30 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ED );.  pPager->
1be40 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
1be50 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65    assertTruncate
1be60 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
1be70 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  r);.}.../*.** Th
1be80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1be90 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
1bea0 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
1beb0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
1bec0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
1bed0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
1bee0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
1bef0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1bf00 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
1bf10 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1bf20 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
1bf30 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
1bf40 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
1bf50 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
1bf60 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
1bf70 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
1bf80 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
1bf90 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
1bfa0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
1bfb0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
1bfc0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
1bfd0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
1bfe0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
1bff0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
1c000 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
1c010 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
1c020 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
1c030 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
1c040 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
1c050 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
1c060 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
1c070 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1c080 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
1c090 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
1c0a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1c0b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1c0c0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
1c0d0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1c0e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
1c0f0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
1c100 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1c110 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c120 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
1c130 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
1c140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1c150 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1c160 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1c170 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
1c180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c1a0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1c1b0 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
1c1c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
1c1d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c1e0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
1c1f0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
1c200 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
1c210 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
1c220 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
1c230 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
1c240 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
1c250 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1c260 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
1c270 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1c280 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
1c290 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
1c2a0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
1c2b0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
1c2c0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
1c2d0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
1c2e0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
1c2f0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
1c300 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
1c310 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
1c320 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
1c330 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
1c340 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
1c350 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
1c360 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
1c370 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
1c380 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1c390 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
1c3a0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
1c3b0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
1c3c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
1c3d0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
1c3e0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
1c3f0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
1c400 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
1c410 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
1c420 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
1c430 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
1c440 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
1c450 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
1c460 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
1c470 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
1c480 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 64 69  pTmpSpace;..  di
1c490 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1c4a0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
1c4b0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
1c4c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61  nMalloc();.  pPa
1c4d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
1c4e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
1c4f0 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
1c500 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65   sqlite3WalClose
1c510 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1c520 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
1c530 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1c540 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1c550 6e 63 5f 66 6c 61 67 73 29 2c 20 70 54 6d 70 0a  nc_flags), pTmp.
1c560 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70    );.  pPager->p
1c570 57 61 6c 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  Wal = 0;.  pager
1c580 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1c590 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1c5a0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1c5b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
1c5c0 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67  {.    /* Set Pag
1c5d0 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  er.journalHdr to
1c5e0 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65   -1 for the bene
1c5f0 66 69 74 20 6f 66 20 74 68 65 20 70 61 67 65 72  fit of the pager
1c600 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20  _playback() .   
1c610 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d   ** call which m
1c620 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20  ay be made from 
1c630 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f  within pagerUnlo
1c640 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e  ckAndRollback().
1c650 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73   If it.    ** is
1c660 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68   not -1, then th
1c670 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  e unsynced porti
1c680 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f  on of an open jo
1c690 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20  urnal file may. 
1c6a0 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20     ** be played 
1c6b0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
1c6c0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
1c6d0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
1c6e0 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  s while.    ** t
1c6f0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
1c700 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  , the database m
1c710 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ay become corrup
1c720 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
1c730 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c740 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
1c750 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
1c760 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
1c770 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1c780 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
1c790 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
1c7a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
1c7b0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1c7c0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
1c7d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1c7e0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
1c7f0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
1c800 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c810 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
1c820 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
1c830 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
1c840 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1c850 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
1c860 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
1c870 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
1c880 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
1c890 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
1c8a0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
1c8b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
1c8c0 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
1c8d0 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
1c8e0 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
1c8f0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1c900 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
1c910 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
1c920 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
1c930 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
1c940 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
1c950 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1c960 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
1c970 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
1c980 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1c990 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
1c9a0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
1c9b0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1c9c0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
1c9d0 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
1c9e0 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
1c9f0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
1ca00 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
1ca10 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1ca20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
1ca30 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
1ca40 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
1ca50 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1ca60 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1ca70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1ca80 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
1ca90 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
1caa0 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
1cab0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1cac0 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
1cad0 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
1cae0 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
1caf0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
1cb00 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1cb10 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
1cb20 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
1cb30 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
1cb40 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
1cb50 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
1cb60 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
1cb70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1cb80 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
1cb90 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
1cba0 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73  nc flag is not s
1cbb0 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
1cbc0 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e  nction is a.** n
1cbd0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
1cbe0 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
1cbf0 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
1cc00 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
1cc10 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69  .** and the devi
1cc20 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1cc30 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69  cs of the the fi
1cc40 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
1cc50 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
1cc60 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1cc70 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
1cc80 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
1cc90 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
1cca0 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
1ccb0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
1ccc0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
1ccd0 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1cce0 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
1ccf0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
1cd00 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
1cd10 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
1cd20 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1cd30 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
1cd40 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
1cd50 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
1cd60 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
1cd70 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
1cd80 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
1cd90 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
1cda0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
1cdb0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
1cdc0 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
1cdd0 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
1cde0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
1cdf0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1ce00 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
1ce10 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
1ce20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
1ce30 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
1ce40 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
1ce50 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
1ce60 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
1ce70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1ce80 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
1ce90 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
1cea0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
1ceb0 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
1cec0 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
1ced0 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
1cee0 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
1cef0 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
1cf00 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
1cf10 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
1cf20 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
1cf30 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
1cf40 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
1cf50 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
1cf60 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
1cf70 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
1cf80 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e  *.** The Pager.n
1cf90 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1cfa0 6e 65 76 65 72 20 62 65 20 73 65 74 20 66 6f 72  never be set for
1cfb0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1cfc0 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65  , or any.** file
1cfd0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f   operating in no
1cfe0 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65  -sync mode (Page
1cff0 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20  r.noSync set to 
1d000 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a  non-zero)..**.**
1d010 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1d020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
1d030 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
1d040 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
1d050 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
1d060 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
1d070 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
1d080 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1d090 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
1d0a0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1d0b0 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
1d0c0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1d0d0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d0e0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
1d0f0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
1d100 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d110 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
1d120 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1d130 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1d140 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1d150 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1d160 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1d170 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
1d180 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY ){.      int 
1d190 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1d1c0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  */.      const i
1d1d0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
1d1e0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1d1f0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1d200 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
1d210 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1d220 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
1d230 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
1d240 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1d250 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
1d260 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
1d270 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
1d280 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
1d290 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
1d2a0 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
1d2b0 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
1d2c0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
1d2d0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
1d2e0 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
1d2f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
1d300 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1d310 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
1d320 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
1d330 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
1d340 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
1d350 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
1d360 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
1d370 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
1d380 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1d390 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
1d3a0 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
1d3b0 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
1d3c0 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
1d3d0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
1d3e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
1d3f0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
1d400 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
1d410 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
1d420 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
1d430 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
1d440 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
1d450 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
1d460 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
1d470 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
1d480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d490 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
1d4a0 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
1d4b0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1d4c0 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
1d4d0 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
1d4e0 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
1d4f0 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
1d500 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
1d510 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
1d520 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
1d530 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
1d540 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
1d550 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
1d560 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
1d570 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
1d580 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
1d590 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
1d5a0 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1d5b0 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
1d5c0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1d5d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1d5e0 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
1d5f0 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
1d600 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
1d610 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
1d620 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
1d630 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
1d640 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
1d650 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
1d660 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
1d670 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
1d680 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
1d690 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
1d6a0 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
1d6b0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
1d6c0 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
1d6d0 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
1d6e0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1d6f0 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
1d700 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
1d710 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
1d720 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
1d730 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
1d740 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
1d750 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
1d760 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
1d770 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
1d780 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
1d790 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
1d7a0 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
1d7b0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
1d7c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d7d0 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
1d7e0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
1d7f0 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
1d800 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
1d810 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1d820 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
1d830 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
1d840 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
1d850 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1d860 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
1d870 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
1d880 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
1d890 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
1d8a0 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
1d8b0 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
1d8c0 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
1d8d0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
1d8e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d8f0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1d900 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
1d910 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
1d920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
1d940 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
1d950 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
1d960 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
1d970 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1d980 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
1d990 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d9a0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1d9b0 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
1d9c0 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
1d9d0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
1d9e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1d9f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1da00 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1da10 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1da20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1da30 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
1da40 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1da50 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1da60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1da70 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
1da80 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
1da90 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
1daa0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
1dab0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
1dac0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
1dad0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
1dae0 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
1daf0 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
1db00 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
1db10 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
1db20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
1db30 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
1db40 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
1db50 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
1db60 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
1db70 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
1db80 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
1db90 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
1dba0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
1dbb0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
1dbc0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1dbd0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
1dbe0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
1dbf0 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
1dc00 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1dc10 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
1dc20 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
1dc30 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
1dc40 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
1dc50 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
1dc60 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
1dc70 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
1dc80 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
1dc90 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
1dca0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1dcb0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1dcc0 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
1dcd0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1dce0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
1dcf0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1dd00 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
1dd10 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1dd20 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
1dd30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1dd40 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1dd50 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
1dd60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1dd70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1dd80 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1dd90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1dda0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ddb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ddc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
1ddd0 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
1dde0 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
1ddf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1de00 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
1de10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1de20 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
1de30 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
1de40 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
1de50 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
1de60 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
1de70 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1de80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1de90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1dea0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
1deb0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1dec0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
1ded0 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
1dee0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
1def0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
1df00 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
1df10 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
1df20 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1df30 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1df40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1df50 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1df60 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1df70 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
1df80 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  (pPager->sync_fl
1df90 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
1dfa0 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
1dfb0 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
1dfc0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1dfd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dfe0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1dff0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e000 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
1e010 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
1e020 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
1e030 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e  ced. Set Pager.n
1e040 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
1e050 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61  to zero and clea
1e060 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
1e070 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c  _SYNC flag on al
1e080 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f  l pagess..    */
1e090 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
1e0a0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
1e0b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1e0c0 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 70  arted = 1;.    p
1e0d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1e0e0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
1e0f0 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69  nalOff;.    sqli
1e100 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79  te3PcacheClearSy
1e110 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e  ncFlags(pPager->
1e120 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
1e130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e140 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1e150 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1e160 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
1e170 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
1e180 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
1e190 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
1e1a0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
1e1b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
1e1c0 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
1e1d0 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
1e1e0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
1e1f0 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
1e200 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
1e210 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
1e220 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
1e230 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
1e240 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
1e250 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1e260 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
1e270 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
1e280 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
1e290 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1e2a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1e2b0 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
1e2c0 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
1e2d0 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
1e2e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
1e2f0 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
1e300 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
1e310 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
1e320 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
1e330 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
1e340 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1e350 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
1e360 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1e370 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1e380 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
1e390 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
1e3a0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
1e3b0 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
1e3c0 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
1e3d0 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
1e3e0 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
1e3f0 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
1e400 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
1e410 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
1e420 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
1e430 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
1e440 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
1e450 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
1e460 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
1e470 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
1e480 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
1e490 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
1e4a0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
1e4b0 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
1e4c0 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
1e4d0 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
1e4e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
1e4f0 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
1e500 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1e510 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1e520 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
1e530 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
1e540 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
1e550 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
1e560 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
1e570 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
1e580 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
1e590 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1e5a0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
1e5b0 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
1e5c0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
1e5d0 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
1e5e0 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
1e5f0 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
1e600 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
1e610 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
1e620 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
1e630 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
1e640 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
1e650 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1e660 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
1e670 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
1e680 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e690 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
1e6a0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1e6b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
1e6c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
1e6d0 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
1e6e0 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
1e6f0 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
1e700 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1e710 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1e720 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
1e730 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
1e740 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
1e750 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e780 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e7b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
1e7c0 69 66 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d  if( NEVER(pList=
1e7d0 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0) ) return SQL
1e7e0 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
1e7f0 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
1e800 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
1e810 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
1e820 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
1e830 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
1e840 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
1e850 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1e860 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
1e870 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
1e880 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
1e890 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
1e8a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1e8b0 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
1e8c0 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
1e8d0 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
1e8e0 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
1e8f0 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
1e900 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
1e910 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
1e920 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
1e930 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
1e940 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
1e950 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
1e960 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1e970 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
1e980 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
1e990 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
1e9a0 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
1e9b0 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
1e9c0 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
1e9d0 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
1e9e0 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
1e9f0 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
1ea00 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
1ea10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
1ea20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
1ea30 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
1ea40 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
1ea50 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
1ea60 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
1ea70 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
1ea80 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
1ea90 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
1eaa0 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
1eab0 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
1eac0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1ead0 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
1eae0 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
1eaf0 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
1eb00 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1eb10 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
1eb20 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
1eb30 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
1eb40 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1eb50 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
1eb60 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
1eb70 65 72 55 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e  erUseWal(pList->
1eb80 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1eb90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1eba0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1ebb0 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ED );.  rc = pag
1ebc0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1ebd0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
1ebe0 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49  E_LOCK);..  /* I
1ebf0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
1ec00 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
1ec10 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
1ec20 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
1ec30 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
1ec40 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
1ec50 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
1ec60 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
1ec70 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
1ec80 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
1ec90 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
1eca0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
1ecb0 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
1ecc0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
1ecd0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1ece0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ecf0 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
1ed00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ed10 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
1ed20 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
1ed30 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
1ed40 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
1ed50 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1ed60 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
1ed70 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1ed80 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
1ed90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1eda0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
1edb0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1edc0 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
1edd0 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
1ede0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1edf0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
1ee00 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
1ee10 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
1ee20 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
1ee30 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
1ee40 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
1ee50 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
1ee60 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
1ee70 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
1ee80 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
1ee90 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
1eea0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
1eeb0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
1eec0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
1eed0 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
1eee0 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
1eef0 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
1ef00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1ef10 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
1ef20 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
1ef30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
1ef40 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
1ef50 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
1ef60 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
1ef70 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
1ef80 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1ef90 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
1efa0 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
1efb0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
1efc0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
1eff0 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
1f000 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
1f010 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1f020 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
1f030 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
1f040 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
1f050 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
1f060 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
1f070 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
1f080 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
1f090 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f0a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1f0b0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
1f0c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
1f0d0 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
1f0e0 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
1f0f0 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
1f100 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
1f110 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
1f120 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1f130 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
1f140 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f150 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
1f160 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
1f170 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
1f180 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
1f190 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
1f1a0 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
1f1b0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
1f1c0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
1f1d0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1f1e0 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
1f1f0 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
1f200 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1f210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f220 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
1f230 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
1f240 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
1f250 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
1f260 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f270 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
1f280 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
1f290 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
1f2a0 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
1f2b0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1f2c0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
1f2d0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
1f2e0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
1f2f0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
1f300 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
1f310 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
1f320 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f350 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1f360 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
1f370 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1f380 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
1f390 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1f3a0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1f3b0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1f3c0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
1f3d0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1f3e0 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
1f3f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f400 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1f410 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
1f420 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1f430 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
1f440 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1f450 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1f460 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
1f470 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1f480 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
1f490 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
1f4a0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
1f4b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1f4c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1f4d0 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
1f4e0 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1f4f0 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
1f500 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
1f510 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
1f520 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
1f530 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
1f540 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
1f550 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
1f560 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
1f570 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
1f580 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1f590 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
1f5a0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1f5b0 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
1f5c0 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
1f5d0 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
1f5e0 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
1f5f0 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
1f600 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1f610 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f620 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1f630 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
1f640 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
1f650 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
1f660 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
1f670 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1f680 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
1f690 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
1f6a0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
1f6b0 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
1f6c0 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
1f6d0 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
1f6e0 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
1f6f0 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
1f700 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
1f710 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f720 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f730 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1f740 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73  pPager;.  if( is
1f750 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
1f760 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
1f770 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
1f780 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73  ta;.    i64 offs
1f790 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  et = pPager->nSu
1f7a0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
1f7b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63  pageSize);.    c
1f7c0 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
1f7d0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
1f7e0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1f7f0 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
1f800 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
1f810 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41  2);.    PAGERTRA
1f820 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
1f830 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1f840 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f850 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1f860 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61   .    assert( pa
1f870 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1f880 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
1f890 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1f8a0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
1f8b0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1f8c0 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
1f8d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   );.    rc = wri
1f8e0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1f8f0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
1f900 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1f910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f920 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f930 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1f940 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
1f950 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1f960 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
1f970 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1f980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f990 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
1f9a0 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
1f9b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
1f9c0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
1f9d0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
1f9e0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1f9f0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1fa00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1fa10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1fa20 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1fa30 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1fa40 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1fa50 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1fa60 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1fa70 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1fa80 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1fa90 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1faa0 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1fab0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1fac0 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1fad0 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1fae0 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1faf0 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1fb00 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74 69 63  ged. .*/ .static
1fb10 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61   int pagerWalFra
1fb20 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  mes(.  Pager *pP
1fb30 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
1fb40 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1fb50 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64  object */.  PgHd
1fb60 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  r *pList,       
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1fb80 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f  ist of frames to
1fb90 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e   log */.  Pgno n
1fba0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1fbb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1fbc0 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72  abase size after
1fbd0 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a   this commit */.
1fbe0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c 20    int isCommit, 
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1fc10 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f  s is a commit */
1fc20 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c 61 67  .  int sync_flag
1fc30 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1fc40 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70     /* Flags to p
1fc50 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29 20  ass to OsSync() 
1fc60 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20 69  (or 0) */.){.  i
1fc70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc90 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1fca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1fcb0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 72 63  er->pWal );.  rc
1fcc0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61   = sqlite3WalFra
1fcd0 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  mes(pPager->pWal
1fce0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1fcf0 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74  >pageSize, pList
1fd00 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43  , nTruncate, isC
1fd10 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c 61 67  ommit, sync_flag
1fd20 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
1fd30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1fd40 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
1fd50 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
1fd60 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1fd70 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1fd80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1fd90 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1fda0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70  r->pBackup, p->p
1fdb0 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44  gno, (u8 *)p->pD
1fdc0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1fdd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fde0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1fdf0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
1fe00 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
1fe10 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
1fe20 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
1fe30 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
1fe40 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1fe50 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
1fe60 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
1fe70 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
1fe80 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
1fe90 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
1fea0 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
1feb0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
1fec0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
1fed0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1fee0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
1fef0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
1ff00 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
1ff10 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
1ff20 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1ff30 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
1ff40 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
1ff50 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
1ff60 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
1ff70 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1ff80 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
1ff90 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
1ffa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ffb0 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
1ffc0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
1ffd0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
1ffe0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fff0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
20000 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
20010 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
20020 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20030 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
20040 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
20050 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
20060 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
20070 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
20080 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
20090 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
200a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
200b0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
200c0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
200d0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
200e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
200f0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
20100 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
20110 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
20120 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
20130 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
20140 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
20150 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
20160 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
20170 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
20180 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
20190 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
201a0 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
201b0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
201c0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
201d0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
201e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
201f0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
20200 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
20210 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
20220 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
20230 3b 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  ;..  pPg->pDirty
20240 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
20250 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20260 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
20270 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
20280 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
20290 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
202a0 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
202b0 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
202c0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
202d0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
202e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
202f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20300 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
20310 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
20320 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  pPg, 0, 0, 0);. 
20330 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
20340 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79    /* The doNotSy
20350 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 62  nc flag is set b
20360 79 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  y the sqlite3Pag
20370 65 72 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  erWrite() functi
20380 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 20 20  on while it.    
20390 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e  ** is journallin
203a0 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f  g a set of two o
203b0 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20  r more database 
203c0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 73  pages that are s
203d0 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f 6e 20  tored.    ** on 
203e0 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65  the same disk se
203f0 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68  ctor. Syncing th
20400 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
20410 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20   allowed while. 
20420 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
20430 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69 73  ppening as it is
20440 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
20450 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20 73  all members of s
20460 75 63 68 20 61 0a 20 20 20 20 2a 2a 20 73 65 74  uch a.    ** set
20470 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79   of pages are sy
20480 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67  nced to disk tog
20490 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68  ether. So, if th
204a0 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63  e page this func
204b0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 74  tion.    ** is t
204c0 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c  rying to make cl
204d0 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65  ean will require
204e0 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20   a journal sync 
204f0 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  and the doNotSyn
20500 63 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  c.    ** flag is
20510 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74   set, return wit
20520 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
20530 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65 20  ing. The pcache 
20540 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 20 20 2a  layer will.    *
20550 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67  * just have to g
20560 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f  o ahead and allo
20570 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
20580 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f  buffer instead o
20590 66 0a 20 20 20 20 2a 2a 20 72 65 75 73 69 6e 67  f.    ** reusing
205a0 20 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   pPg..    **.   
205b0 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
205c0 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
205d0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
205e0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
205f0 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   do not.    ** t
20600 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
20610 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67 20  contents of pPg 
20620 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  to disk..    */.
20630 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 50      if( NEVER(pP
20640 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20  ager->errCode). 
20650 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
20660 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50 67  doNotSync && pPg
20670 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
20680 45 44 5f 53 59 4e 43 29 0a 20 20 20 20 29 7b 0a  ED_SYNC).    ){.
20690 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
206a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
206b0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
206c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
206d0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
206e0 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
206f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
20700 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20710 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
20720 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
20730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
20740 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
20750 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50  && .        !(pP
20760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
20770 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
20780 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a  MODE_MEMORY) &&.
20790 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65          !(sqlite
207a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
207b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
207c0 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
207d0 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20  P_SAFE_APPEND). 
207e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
207f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
20800 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
20810 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
20820 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
20830 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
20840 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
20850 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
20860 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
20870 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
20880 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  of.    ** the da
20890 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
208a0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
208b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
208c0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ub-journal..    
208d0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
208e0 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  se the call to p
208f0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
20900 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c  ist() below will
20910 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75   not.    ** actu
20920 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
20930 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
20940 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a  his case..    **
20950 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  .    ** Consider
20960 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
20970 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
20980 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
20990 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a     BEGIN;.    **
209a0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
209b0 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
209c0 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
209d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45  .    **     SAVE
209e0 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a  POINT sp;.    **
209f0 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
20a00 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
20a10 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20  Y pages>.    ** 
20a20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
20a30 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a  s(page X).    **
20a40 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
20a50 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20   sp;.    **.    
20a60 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
20a70 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
20a80 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
20a90 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
20aa0 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f  written.    ** o
20ab0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
20ac0 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
20ad0 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
20ae0 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
20af0 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  n,.    ** follow
20b00 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
20b10 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
20b20 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
20b30 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20   X will read.   
20b40 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
20b50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20b60 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
20b70 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58  e copy of page X
20b80 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61   as it.    ** wa
20b90 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
20ba0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
20bb0 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
20bc0 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
20bd0 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65  ".    ** was exe
20be0 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  cuted..    **.  
20bf0 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
20c00 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
20c10 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
20c20 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
20c30 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a  he .    ** sub-j
20c40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
20c50 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
20c60 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
20c70 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
20c80 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
20c90 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
20ca0 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
20cb0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
20cc0 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75  is .    ** execu
20cd0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
20ce0 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20  if( NEVER(.     
20cf0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
20d00 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
20d10 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
20d20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
20d30 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20  (pPg).    ) ){. 
20d40 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
20d50 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
20d60 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
20d70 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
20d80 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
20d90 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
20da0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
20db0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20dc0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
20dd0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
20de0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
20df0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
20e00 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
20e10 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
20e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e30 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
20e40 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
20e50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20e60 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
20e70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
20e80 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
20e90 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20ea0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
20eb0 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  er, rc);.}.../*.
20ec0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
20ed0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
20ee0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
20ef0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
20f00 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
20f10 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
20f20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
20f30 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
20f40 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
20f50 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
20f60 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
20f70 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
20f80 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
20f90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20fa0 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
20fb0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
20fc0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
20fd0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
20fe0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
20ff0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
21000 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
21010 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
21020 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
21030 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
21040 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
21050 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
21060 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
21070 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
21080 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
21090 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
210a0 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
210b0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
210c0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
210d0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
210e0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
210f0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
21100 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
21110 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
21120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
21130 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
21140 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
21150 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
21160 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
21170 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
21180 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
21190 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
211a0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
211b0 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
211c0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
211d0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
211e0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
211f0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
21200 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
21210 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
21220 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
21230 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
21240 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
21250 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
21260 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45   and PAGER_NO_RE
21270 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a  ADLOCK flags..**
21280 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
21290 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
212a0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
212b0 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
212c0 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
212d0 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
212e0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
212f0 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
21300 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
21310 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
21320 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
21330 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
21340 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
21350 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
21360 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21370 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
21380 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
21390 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
213a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
213b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
213c0 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
213d0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
213e0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
213f0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
21400 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
21410 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
21420 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
21430 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
21440 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
21450 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
21460 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
21470 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
21480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21490 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
214a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
214b0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
214c0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
214d0 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
214e0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
214f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
21500 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
21510 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
21520 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
21530 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
21540 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21550 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
21560 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21580 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
21590 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
215a0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
215b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
215c0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
215d0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
215e0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
215f0 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
21600 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
21610 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
21620 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
21630 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
21640 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
21650 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
21660 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
21670 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
21680 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
21690 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
216a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
216b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
216c0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
216d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
216e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
216f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
21700 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
21710 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
21720 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
21730 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
21740 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
21750 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21760 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
21770 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
21780 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
21790 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
217a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
217b0 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
217c0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
217d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
217e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
217f0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
21800 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
21810 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
21820 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
21830 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
21840 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
21850 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
21860 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
21870 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
21880 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
21890 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
218a0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
218b0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
218c0 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
218d0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
218e0 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
218f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
21900 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f  READLOCK)!=0;  /
21910 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72  * True to omit r
21920 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  ead-lock */.  in
21930 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
21940 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
21950 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
21960 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
21970 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
21980 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  16 szPageDflt = 
21990 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
219a0 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
219b0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
219c0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
219d0 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
219e0 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
219f0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
21a00 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
21a10 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
21a20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
21a30 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
21a40 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
21a50 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  This.  ** is the
21a60 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
21a70 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69  equired for an i
21a80 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
21a90 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20   file handle .  
21aa0 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72  ** and a regular
21ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
21ac0 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  ndle. Note that 
21ad0 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  a "regular journ
21ae0 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20  al-handle".  ** 
21af0 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72  may be a wrapper
21b00 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68   capable of cach
21b10 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
21b20 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  rtion of the jou
21b30 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
21b40 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c  n memory to impl
21b50 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63  ement the atomic
21b60 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
21b70 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73  ion (see .  ** s
21b80 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e  ource file journ
21b90 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  al.c)..  */.  if
21ba0 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
21bb0 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
21bc0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
21bd0 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
21be0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
21bf0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
21c00 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20  lSize(pVfs));.  
21c10 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
21c20 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
21c30 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  ND8(sqlite3MemJo
21c40 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
21c50 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
21c60 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
21c70 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
21c80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
21c90 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
21ca0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   0;..  /* Comput
21cb0 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
21cc0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e  full pathname in
21cd0 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   an allocated bu
21ce0 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a  ffer pointed.  *
21cf0 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d  * to by zPathnam
21d00 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e  e, length nPathn
21d10 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ame. Or, if this
21d20 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
21d30 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65  file,.  ** leave
21d40 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20   both nPathname 
21d50 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65  and zPathname se
21d60 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  t to 0..  */.  i
21d70 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
21d80 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
21d90 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
21da0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
21db0 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
21dc0 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
21dd0 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  c(nPathname*2);.
21de0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
21df0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
21e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
21e10 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  M;.    }.#ifndef
21e20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
21e30 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
21e40 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
21e50 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
21e60 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
21e70 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  ;.      zPathnam
21e80 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  e[0] = 0;.    }e
21e90 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
21ea0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
21eb0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
21ec0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
21ed0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
21ee0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
21ef0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
21f00 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
21f10 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
21f20 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
21f30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
21f40 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ..    nPathname 
21f50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
21f60 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
21f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21f80 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
21f90 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
21fa0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
21fb0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
21fc0 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
21fd0 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
21fe0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
21ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
22000 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
22010 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
22020 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
22030 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
22040 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
22050 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
22060 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
22070 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
22080 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
22090 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
220a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
220b0 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
220c0 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
220d0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
220e0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
220f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22100 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
22110 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22140 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
22150 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22160 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22170 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
22180 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
22190 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
221a0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
221b0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
221c0 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
221d0 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
221e0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
221f0 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
22200 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
22210 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
22220 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
22230 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
22260 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
22270 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
22280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22290 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
222a0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
222b0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
222c0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
222d0 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
222e0 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
222f0 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
22300 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
22310 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
22320 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
22330 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
22340 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
22350 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
22360 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
22370 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
22380 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
22390 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
223a0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
223b0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
223c0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
223d0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
223e0 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
223f0 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
22400 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
22410 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
22420 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
22430 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
22440 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
22450 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
22460 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
22470 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
22480 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
22490 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
224a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
224b0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
224c0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
224d0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
224e0 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
224f0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
22500 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
22530 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
22540 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  8 + 1           
22550 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
22560 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  /.  );.  assert(
22570 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
22580 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
22590 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
225a0 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
225b0 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
225c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
225d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
225e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
225f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
22610 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
22620 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
22630 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
22640 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
22650 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
22660 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
22670 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
22680 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
22690 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
226a0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
226b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
226c0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
226d0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
226e0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
226f0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
22700 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
22710 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
22720 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
22730 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
22740 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
22750 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
22760 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
22770 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
22780 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
22790 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
227a0 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
227b0 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
227c0 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
227d0 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
227e0 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ame ){.    pPage
227f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
22800 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
22810 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a  nPathname + 1);.
22820 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
22830 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
22840 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
22850 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
22860 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
22870 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
22880 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
22890 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
228a0 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
228b0 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29  , "-journal", 8)
228c0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
228d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  ->zFilename[0]==
228e0 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  0 ) pPager->zJou
228f0 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  rnal[0] = 0;.   
22900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
22910 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
22920 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
22930 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
22940 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
22950 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
22960 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
22970 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
22980 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
22990 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
229a0 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
229b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
229c0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
229d0 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
229e0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
229f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
22a00 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
22a10 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
22a20 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
22a30 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64  &fout);.    read
22a40 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
22a50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
22a60 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
22a70 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
22a80 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
22a90 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
22aa0 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
22ab0 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
22ac0 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
22ad0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
22ae0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
22af0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
22b00 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
22b10 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
22b20 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
22b30 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
22b40 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
22b50 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
22b60 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
22b70 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
22b80 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
22b90 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
22ba0 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
22bb0 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
22bc0 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
22bd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
22be0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
22bf0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
22c00 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
22c10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
22c20 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
22c30 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
22c40 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
22c50 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
22c60 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
22c70 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
22c80 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
22c90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
22ca0 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
22cb0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
22cc0 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
22cd0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
22ce0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
22cf0 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
22d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22d10 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
22d20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73  = (u16)pPager->s
22d30 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
22d40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
22d50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
22d60 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
22d70 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
22d80 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
22d90 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
22da0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
22db0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  fd);.        int
22dc0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
22dd0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
22de0 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
22df0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
22e00 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
22e10 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
22e20 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
22e30 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
22e40 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
22e50 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
22e60 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
22e70 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
22e80 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
22e90 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
22ea0 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
22eb0 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
22ec0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
22ed0 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
22ee0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
22ef0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
22f00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22f10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
22f20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
22f30 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
22f40 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
22f50 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
22f60 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
22f70 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
22f80 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
22f90 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
22fa0 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
22fb0 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
22fc0 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
22fd0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
22fe0 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
22ff0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
23000 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
23010 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
23020 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
23030 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
23040 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
23050 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
23060 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
23070 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
23080 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
23090 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
230a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
230b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
230c0 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
230d0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
230e0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
230f0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
23100 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
23110 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
23120 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
23130 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
23140 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
23150 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
23160 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
23170 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
23180 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
23190 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
231a0 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
231b0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
231c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
231d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
231e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
231f0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
23200 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
23210 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
23220 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
23230 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
23240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23250 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
23260 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
23270 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
23280 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
23290 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
232a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
232b0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
232c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
232d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
232e0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
232f0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
23300 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
23310 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
23320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23330 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
23340 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
23350 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
23360 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
23370 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
23380 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
23390 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
233a0 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
233b0 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
233c0 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
233d0 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
233f0 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
23400 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
23410 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
23420 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
23430 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
23440 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
23450 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
23460 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
23470 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
23480 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
23490 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
234a0 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
234b0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
234c0 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
234d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
234e0 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
234f0 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
23500 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
23510 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
23520 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
23530 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
23540 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
23550 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
23560 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
23570 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62  alid = (u8)memDb
23580 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
23590 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
235a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
235b0 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
235c0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
235d0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
235e0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
235f0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
23600 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
23610 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
23620 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
23630 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
23640 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
23650 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
23660 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
23670 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
23680 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
23690 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
236a0 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
236b0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
236c0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
236d0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
236e0 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
236f0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
23700 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
23710 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
23720 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
23730 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
23740 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
23750 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
23760 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
23770 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
23780 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
23790 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
237a0 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
237b0 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
237c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
237d0 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20  )readOnly;.  /* 
237e0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
237f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72   = 0; */.  asser
23800 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
23810 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
23820 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
23830 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
23840 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
23850 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
23860 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
23870 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
23880 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
23890 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
238a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
238b0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
238c0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
238d0 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
238e0 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
238f0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
23900 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
23910 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
23920 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
23930 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
23940 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
23950 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
23960 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
23970 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
23980 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
23990 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
239a0 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29  f( !useJournal )
239b0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
239c0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
239d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
239e0 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d  F;.  }else if( m
239f0 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
23a00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
23a10 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
23a20 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  ODE_MEMORY;.  }.
23a30 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75    /* pPager->xBu
23a40 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
23a50 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
23a60 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
23a70 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
23a80 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
23a90 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65  init;.  /* memse
23aa0 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
23ab0 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
23ac0 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a  r->aHash)); */..
23ad0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
23ae0 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
23af0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a  LITE_OK;.}..../*
23b00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23b10 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
23b20 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
23b30 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
23b40 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
23b50 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
23b60 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
23b70 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
23b80 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
23b90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
23ba0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
23bb0 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
23bc0 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
23bd0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
23be0 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
23bf0 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
23c00 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
23c10 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
23c20 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
23c30 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
23c40 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
23c50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23c60 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
23c70 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
23c80 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
23c90 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
23ca0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
23cb0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
23cc0 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
23cd0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
23ce0 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
23cf0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
23d00 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
23d10 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
23d20 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
23d30 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
23d40 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
23d50 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
23d60 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
23d70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23d80 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
23d90 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
23da0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
23db0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
23dc0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
23dd0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
23de0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
23df0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
23e00 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
23e10 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
23e20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
23e30 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
23e40 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
23e50 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
23e60 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
23e70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
23e80 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
23e90 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
23ea0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
23eb0 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
23ec0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
23ed0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
23ee0 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
23ef0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
23f00 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
23f10 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
23f20 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
23f30 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
23f40 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
23f50 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
23f60 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
23f70 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
23f80 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
23f90 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
23fa0 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
23fb0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
23fc0 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
23fd0 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
23fe0 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
23ff0 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
24000 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
24010 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
24020 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
24030 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
24040 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
24050 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
24060 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
24070 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
24080 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
24090 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
240a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
240b0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
240c0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
240d0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
240e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
240f0 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
24100 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
24110 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
24120 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
24130 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
24140 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24150 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
24160 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24170 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
24180 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
24190 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
241a0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
241b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
241d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
241e0 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  exists;         
241f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24200 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
24210 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
24220 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
24230 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
24240 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
24250 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
24260 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
24270 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
24280 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
24290 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73  er->jfd) );.  as
242a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
242b0 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41  ate <= PAGER_SHA
242c0 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73  RED );..  *pExis
242d0 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  ts = 0;.  rc = s
242e0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
242f0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
24300 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
24310 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
24320 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d  ists);.  if( rc=
24330 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
24340 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
24350 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20  locked;         
24360 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24370 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
24380 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
24390 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
243a0 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
243b0 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
243c0 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
243d0 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
243e0 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
243f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
24400 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
24410 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
24420 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
24430 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
24440 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
24450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
24460 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
24470 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
24480 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
24490 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
244a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
244b0 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
244c0 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
244d0 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
244e0 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
244f0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
24500 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
24510 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
24520 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
24530 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
24540 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
24550 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
24560 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
24570 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
24580 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
24590 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
245a0 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
245b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
245c0 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
245d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
245e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
245f0 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ked ){.      int
24600 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f   nPage;..      /
24610 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65  * Check the size
24620 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
24630 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e   file. If it con
24640 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73  sists of 0 pages
24650 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
24660 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
24670 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65  al file. See the
24680 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
24690 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20  above for .     
246a0 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e   ** the reasonin
246b0 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20  g here.  Delete 
246c0 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75  the obsolete jou
246d0 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a  rnal file under.
246e0 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52        ** a RESER
246f0 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69  VED lock to avoi
24700 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  d race condition
24710 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76  s and to avoid v
24720 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a  iolating.      *
24730 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20  * [H33020]..    
24740 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
24750 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
24760 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
24770 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
24780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24790 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  {.        if( nP
247a0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
247b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
247c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
247d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
247e0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
247f0 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
24800 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
24810 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
24820 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
24830 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
24840 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
24850 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24860 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
24870 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
24880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
24890 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
248a0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
248b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
248c0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
248d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
248e0 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
248f0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
24900 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
24910 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
24920 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
24930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24940 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
24950 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
24960 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
24970 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
24980 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
24990 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
249a0 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
249b0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
249c0 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
249d0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
249e0 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
249f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
24a00 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
24a10 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
24a20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53         int f = S
24a30 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
24a40 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
24a50 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
24a60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24a70 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
24a80 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
24a90 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
24aa0 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
24ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
24ad0 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
24ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
24af0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
24b00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
24b10 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
24b20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
24b30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
24b40 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
24b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24b60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24b80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24b90 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
24ba0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
24bb0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
24bc0 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
24bd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
24be0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
24bf0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
24c00 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
24c10 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
24c20 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
24c30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
24c40 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
24c50 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72  ** its has a zer
24c60 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d  o header, that m
24c70 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61  ight be due to a
24c80 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a  n I/O error, or.
24c90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
24ca0 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74  t might be due t
24cb0 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69  o the race condi
24cc0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61  tion described a
24cd0 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20  bove and in.    
24ce0 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65          ** ticke
24cf0 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72  t #3883.  Either
24d00 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61   way, assume tha
24d10 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
24d20 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20   hot..          
24d30 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
24d40 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74  be a false posit
24d50 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20  ive.  But if it 
24d60 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  is, then the.   
24d70 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f           ** auto
24d80 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c  matic journal pl
24d90 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76  ayback and recov
24da0 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69  ery mechanism wi
24db0 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20  ll deal.        
24dc0 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75      ** with it u
24dd0 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56  nder an EXCLUSIV
24de0 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20  E lock where we 
24df0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20  do not need to. 
24e00 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f             ** wo
24e10 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68  rry so much with
24e20 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
24e30 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
24e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
24e50 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
24e60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24e70 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
24e80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24e90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
24ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24eb0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
24ec0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68  he *-wal file th
24ed0 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
24ee0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  o the database o
24ef0 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a  pened by pPager.
24f00 2a 2a 20 65 78 69 73 74 73 2e 20 41 73 73 75 6d  ** exists. Assum
24f10 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
24f20 75 72 73 2c 20 73 65 74 20 2a 70 45 78 69 73 74  urs, set *pExist
24f30 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 66 69  s to 1 if the fi
24f40 6c 65 20 65 78 69 73 74 73 2c 0a 2a 2a 20 6f 72  le exists,.** or
24f50 20 30 20 6f 74 68 65 72 77 69 73 65 20 61 6e 64   0 otherwise and
24f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24f70 4b 2e 20 49 66 20 61 6e 20 49 4f 20 6f 72 20 4f  K. If an IO or O
24f80 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
24f90 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51   return.** an SQ
24fa0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
24fb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
24fc0 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48  r must hold a SH
24fd0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
24fe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
24ff0 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66  o call this.** f
25000 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65  unction. Because
25010 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
25020 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c  ck on the db fil
25030 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  e is required to
25040 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41   delete .** a WA
25050 4c 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  L, this ensures 
25060 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
25070 20 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77 65   condition betwe
25080 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
25090 20 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20 61   .** below and a
250a0 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
250b0 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
250c0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
250d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
250e0 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c 28 50  nt pagerHasWAL(P
250f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25100 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 69  t *pExists){.  i
25110 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25130 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25140 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
25150 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
25160 20 63 68 61 72 20 2a 7a 57 61 6c 20 3d 20 73 71   char *zWal = sq
25170 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
25180 73 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e  s-wal", pPager->
25190 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
251a0 69 66 28 20 21 7a 57 61 6c 20 29 7b 0a 20 20 20  if( !zWal ){.   
251b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
251c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
251d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
251e0 74 65 33 4f 73 41 63 63 65 73 73 28 70 50 61 67  te3OsAccess(pPag
251f0 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61 6c 2c 20  er->pVfs, zWal, 
25200 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
25210 49 53 54 53 2c 20 70 45 78 69 73 74 73 29 3b 0a  ISTS, pExists);.
25220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25230 65 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zWal);.    }.
25240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
25250 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25260 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
25270 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25280 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  }..static int pa
25290 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  gerOpenSnapshot(
252a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
252b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
252e0 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
252f0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
25300 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25310 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
25320 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
25330 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
25340 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  Pager) );..  rc 
25350 3d 20 73 71 6c 69 74 65 33 57 61 6c 4f 70 65 6e  = sqlite3WalOpen
25360 53 6e 61 70 73 68 6f 74 28 70 50 61 67 65 72 2d  Snapshot(pPager-
25370 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
25380 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
253a0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28 20   dummy;.    if( 
253b0 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 20  changed ){.     
253c0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
253d0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
253e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
253f0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ode || pPager->d
25400 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b  bSizeValid==0 );
25410 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
25420 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
25430 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 64  count(pPager, &d
25440 75 6d 6d 79 29 3b 0a 20 20 7d 0a 20 20 70 50 61  ummy);.  }.  pPa
25450 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
25460 45 52 5f 53 48 41 52 45 44 3b 0a 0a 20 20 72 65  ER_SHARED;..  re
25470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25480 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25490 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
254a0 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
254b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
254c0 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73  e file..** It is
254d0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
254e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
254f0 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74  uire() until aft
25500 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
25510 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63  .** has been suc
25520 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64  cessfully called
25530 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f  . If a shared-lo
25540 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
25550 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20  ld when.** this 
25560 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
25570 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
25580 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  p..**.** The fol
25590 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  lowing operation
255a0 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f  s are also perfo
255b0 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rmed by this fun
255c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31  ction..**.**   1
255d0 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
255e0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50  s currently in P
255f0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
25600 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
25610 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
25620 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
25630 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
25640 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
25650 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
25660 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
25670 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
25680 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
25690 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
256a0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
256b0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
256c0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
256d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
256e0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
256f0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
25700 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
25710 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
25720 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
25730 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
25740 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
25750 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
25760 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
25770 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
25780 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
25790 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
257a0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
257b0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
257c0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
257d0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
257e0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
257f0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
25800 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
25810 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
25820 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
25830 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
25840 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
25850 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
25860 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
25870 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
25880 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
25890 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
258a0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
258b0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
258c0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
258d0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
258e0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
258f0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
25900 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
25910 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
25920 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65  the operation de
25930 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61  scribed by (2) a
25940 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65  bove is not atte
25950 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68  mpted, and if th
25960 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e  e.** pager is in
25970 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
25980 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
25990 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73  E_FULL when this
259a0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74   is called,.** t
259b0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
259c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
259d0 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72  urned. It is per
259e0 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74  mitted to read t
259f0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  he.** database w
25a00 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55  hen in SQLITE_FU
25a10 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  LL error state..
25a20 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
25a30 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
25a40 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
25a50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25a60 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f  ned. If an.** IO
25a70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
25a80 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
25a90 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
25aa0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
25ab0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20  rnal.** file or 
25ac0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
25ad0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
25ae0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
25af0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
25b00 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
25b10 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
25b20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
25b30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25b60 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65  .  int isErrorRe
25b70 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
25b80 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25b90 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d   recovering from
25ba0 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a   error state */.
25bb0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
25bc0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
25bd0 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
25be0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
25bf0 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
25c00 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
25c10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
25c20 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
25c30 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
25c40 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  he)==0 );.  if( 
25c50 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70  NEVER(MEMDB && p
25c60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
25c70 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  ){ return pPager
25c80 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20  ->errCode; }..  
25c90 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
25ca0 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ase is in an err
25cb0 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73  or-state, now is
25cc0 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65   a chance to cle
25cd0 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
25ce0 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
25cf0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
25d00 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72  ager-cache and r
25d10 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79  ollback.  ** any
25d20 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20   hot journal in 
25d30 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
25d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
25d50 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
25d60 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
25d70 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
25d80 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29  ager->zJournal )
25d90 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
25da0 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
25db0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
25dc0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
25dd0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
25de0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
25df0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
25e00 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
25e10 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 53 6e  rc = pagerOpenSn
25e20 61 70 73 68 6f 74 28 70 50 61 67 65 72 29 3b 0a  apshot(pPager);.
25e30 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
25e40 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
25e50 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72  _UNLOCK || isErr
25e60 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73  orReset ){.    s
25e70 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
25e80 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
25e90 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
25ea0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  isHotJournal = 0
25eb0 3b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 20  ;.    int isWal 
25ec0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
25ed0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
25ee0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
25ef0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
25f00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
25f10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
25f20 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
25f30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25f40 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
25f50 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
25f60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
25f70 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SHARED;.    }els
25f80 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
25f90 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
25fa0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
25fb0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
25fc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25fd0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
25fe0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
25ff0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
26000 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26010 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
26020 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
26030 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26040 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
26050 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
26060 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
26070 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
26080 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
26090 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
260a0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
260b0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
260c0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
260d0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
260e0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
260f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26100 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b  !isErrorReset ){
26110 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26120 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20  Pager->state <= 
26130 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
26140 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
26150 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
26160 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
26170 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
26180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26190 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
261a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
261b0 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
261c0 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
261d0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
261e0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
261f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
26200 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
26210 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
26220 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
26230 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
26240 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
26250 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
26260 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
26270 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
26280 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
26290 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
262a0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
262b0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
262c0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
262d0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
262e0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
262f0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
26300 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
26310 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
26320 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
26330 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
26340 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
26350 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
26360 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
26370 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
26380 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
26390 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
263a0 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
263b0 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
263c0 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
263d0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
263e0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
263f0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
26400 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
26410 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
26420 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
26430 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
26440 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
26450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26460 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26470 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
26480 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
26490 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
264a0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
264b0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
264c0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
264d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
264e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
264f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
26500 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
26510 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
26520 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
26530 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
26540 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
26550 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
26560 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
26570 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
26580 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
26590 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
265a0 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
265b0 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
265c0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
265d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
265e0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
265f0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
26600 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
26610 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
26620 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
26630 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
26640 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
26650 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
26660 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
26670 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
26680 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
26690 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
266a0 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
266b0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
266c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
266d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
266e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
266f0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
26700 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  fs,pPager->zJour
26710 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53  nal,SQLITE_ACCES
26720 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a  S_EXISTS,&res);.
26730 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26750 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
26760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
26770 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
26780 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
26790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
267a0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
267b0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
267c0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
267d0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
267e0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
267f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26800 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
26810 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
26820 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
26830 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
26840 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
26850 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
26860 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26870 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
26880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26890 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
268a0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
268b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
268c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
268d0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
268e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
268f0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
26900 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
26910 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
26920 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26930 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
26940 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
26950 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
26960 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
26970 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
26980 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
26990 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
269a0 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
269b0 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
269c0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
269d0 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
269e0 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
269f0 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
26a00 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  it .            
26a10 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
26a20 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
26a30 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
26a40 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
26a50 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
26a60 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
26a70 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
26a80 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
26a90 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
26aa0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
26ab0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
26ac0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
26ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26af0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26b00 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
26b10 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
26b20 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
26b30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74 61   the journal sta
26b40 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69 6e  tus fields to in
26b50 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
26b60 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a  have no.      **
26b70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
26b80 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  l at this time. 
26b90 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
26ba0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
26bb0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
26bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
26bd0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
26be0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
26bf0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
26c00 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
26c10 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
26c20 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
26c30 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
26c40 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a  ced to disk. */.
26c50 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
26c60 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
26c70 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
26c80 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
26c90 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
26ca0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
26cb0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
26cc0 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
26cd0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
26ce0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
26cf0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
26d00 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
26d10 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
26d20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
26d30 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
26d40 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
26d50 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
26d60 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
26d70 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
26d80 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
26d90 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
26da0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
26db0 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
26dc0 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
26dd0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
26de0 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
26df0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
26e00 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
26e10 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
26e20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
26e30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26e40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
26e50 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
26e60 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
26e70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26e90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26ea0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
26eb0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
26ec0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26ee0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
26ef0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
26f00 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
26f10 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
26f20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26f30 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
26f40 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
26f50 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
26f60 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
26f70 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
26f80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
26f90 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
26fa0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
26fb0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
26fc0 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50  ckup || sqlite3P
26fd0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
26fe0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
26ff0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
27000 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
27010 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
27020 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
27030 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
27040 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
27050 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
27060 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
27070 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
27080 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
27090 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
270a0 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
270b0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
270c0 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
270d0 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
270e0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
270f0 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
27100 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
27110 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
27120 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
27130 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
27140 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
27150 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
27160 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
27170 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
27180 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
27190 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
271a0 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
271b0 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
271c0 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
271d0 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
271e0 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
271f0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
27200 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
27210 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
27220 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
27230 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
27240 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
27250 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
27260 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
27270 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
27280 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
27290 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
272a0 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
272b0 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
272c0 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
272d0 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
272e0 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
272f0 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
27300 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
27310 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
27320 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
27330 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
27340 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
27350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
27360 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
27370 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 0a  ager, &nPage);..
27380 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
27390 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
273a0 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
273b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
273c0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
273d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
273e0 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
273f0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
27400 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
27410 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
27420 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
27430 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27440 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
27450 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
27460 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
27470 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
27480 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27490 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
274a0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
274b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
274c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
274d0 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
274e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
274f0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
27500 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
27510 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
27520 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
27530 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
27540 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
27550 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
27560 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
27570 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
27580 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
27590 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
275a0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
275b0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
275c0 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73 57    rc = pagerHasW
275d0 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73 57 61  AL(pPager, &isWa
275e0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
275f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27600 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
27610 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
27620 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 61 67  Wal ){.      pag
27630 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
27640 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
27650 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
27660 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
27670 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27690 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 53 6e  rc = pagerOpenSn
276a0 61 70 73 68 6f 74 28 70 50 61 67 65 72 29 3b 0a  apshot(pPager);.
276b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
276c0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
276d0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
276e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
276f0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
27700 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
27710 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
27720 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 7d 0a  E_DELETE;.    }.
27730 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
27740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27750 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  K ){.    /* page
27760 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20  r_unlock() is a 
27770 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73  no-op for exclus
27780 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d  ive mode and in-
27790 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
277a0 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75  . */.    pager_u
277b0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
277c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
277d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
277e0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
277f0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
27800 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
27810 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
27820 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
27830 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
27840 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
27850 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
27860 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
27870 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
27880 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
27890 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
278a0 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
278b0 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
278c0 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
278d0 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
278e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
278f0 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
27900 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
27910 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
27920 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28  pPager){.  if( (
27930 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
27940 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
27950 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26  Cache)==0).   &&
27960 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75   (!pPager->exclu
27970 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
27980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
27990 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65  ) .  ){.    page
279a0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
279b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
279c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
279d0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
279e0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f  page number pgno
279f0 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72   in pager pPager
27a00 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65   (a page.** refe
27a10 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44  rence has type D
27a20 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20  bPage*). If the 
27a30 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
27a40 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
27a50 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
27a60 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
27a70 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
27a80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
27a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
27aa0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
27ab0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
27ac0 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
27ad0 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
27ae0 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
27af0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
27b00 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
27b10 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
27b20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
27b30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
27b40 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
27b50 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
27b60 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
27b70 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
27b80 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
27b90 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
27ba0 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
27bb0 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
27bc0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
27bd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
27be0 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
27bf0 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
27c00 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
27c10 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
27c20 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
27c30 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
27c40 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
27c50 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
27c60 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
27c70 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
27c80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27c90 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
27ca0 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
27cb0 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
27cc0 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
27cd0 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
27ce0 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
27cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
27d00 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
27d10 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
27d20 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a   page or if a .*
27d30 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  * non-zero value
27d40 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
27d50 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61  e noContent para
27d60 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a  meter and the .*
27d70 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  * requested page
27d80 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
27d90 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61  stored in the ca
27da0 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a  che, then no .**
27db0 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61   actual disk rea
27dc0 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69  d occurs. In thi
27dd0 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72  s case the memor
27de0 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a  y image of the .
27df0 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ** page is initi
27e00 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65  alized to all ze
27e10 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  ros. .**.** If n
27e20 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
27e30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
27e40 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
27e50 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
27e60 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
27e70 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e  . This occurs in
27e80 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63   two seperate sc
27e90 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
27ea0 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
27eb0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
27ec0 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
27ed0 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
27ee0 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
27ef0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
27f00 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
27f10 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
27f20 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
27f30 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
27f40 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
27f50 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
27f60 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
27f70 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
27f80 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
27f90 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
27fa0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
27fb0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
27fc0 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
27fd0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
27fe0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
27ff0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
28000 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
28010 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
28020 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
28030 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
28040 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
28050 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
28060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
28070 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
28080 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
28090 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
280a0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
280b0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
280c0 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
280d0 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
280e0 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
280f0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
28100 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
28110 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
28120 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
28130 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
28140 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
28150 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
28160 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
28170 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
28180 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
28190 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
281a0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
281b0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
281c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
281d0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
281e0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
281f0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
28200 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
28210 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
28220 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
28230 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
28240 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
28250 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
28260 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
28270 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
28280 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
28290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
282a0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
282b0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
282c0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
282d0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
282e0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
282f0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
28300 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
28310 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
28320 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
28330 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
28340 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
28350 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
28360 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
28370 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
28380 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
28390 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
283a0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
283b0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
283c0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
283d0 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
283e0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
283f0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
28400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
28410 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
28420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
28430 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
28440 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
28450 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
28460 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
28470 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
28480 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
28490 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
284a0 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
284b0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
284c0 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
284d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
284e0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
284f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
28500 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28510 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
28520 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
28530 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  UNLOCK );..  if(
28540 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
28550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
28560 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
28570 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
28580 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
28590 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
285a0 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
285b0 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
285c0 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
285d0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
285e0 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
285f0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
28600 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
28610 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
28620 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
28630 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
28640 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
28650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
28660 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
28670 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
28680 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
28690 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ppPage);.  }..  
286a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
286b0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
286c0 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
286d0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
286e0 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
286f0 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
28700 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
28710 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
28720 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
28730 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
28740 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
28750 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
28760 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
28770 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
28780 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
28790 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
287a0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
287b0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
287c0 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
287d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
287e0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
287f0 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61  pPager || (*ppPa
28800 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  ge)->pPager==0 )
28810 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  ;..  if( (*ppPag
28820 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  e)->pPager && !n
28830 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
28840 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
28850 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
28860 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
28870 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
28880 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
28890 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
288a0 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
288b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
288c0 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
288d0 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
288e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
288f0 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52  er) );.    PAGER
28900 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
28910 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  it);.    return 
28920 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
28930 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
28940 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
28950 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
28960 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
28970 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
28980 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
28990 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61    */.    int nMa
289a0 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  x;..    PAGER_IN
289b0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
289c0 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  );.    pPg = *pp
289d0 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
289e0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
289f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
28a00 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
28a10 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
28a20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
28a30 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
28a40 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
28a50 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
28a60 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
28a70 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
28a80 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
28a90 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
28aa0 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
28ab0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
28ac0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
28ad0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28ae0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
28af0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
28b00 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
28b10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
28b20 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
28b30 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28   &nMax);.    if(
28b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28b50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
28b60 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
28b70 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
28b80 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e  EMDB || nMax<(in
28b90 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  t)pgno || noCont
28ba0 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
28bb0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
28bc0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
28bd0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
28be0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28bf0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TE_FULL;.       
28c00 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
28c10 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
28c20 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
28c30 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
28c40 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
28c50 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
28c60 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
28c70 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
28c80 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
28c90 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
28ca0 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
28cb0 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
28cc0 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
28cd0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
28ce0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
28cf0 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
28d00 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
28d10 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
28d20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
28d30 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
28d40 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
28d50 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
28d60 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
28d70 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
28d80 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
28d90 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
28da0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
28db0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
28dc0 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
28dd0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
28de0 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
28df0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
28e00 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
28e10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
28e20 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
28e30 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
28e40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
28e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28e60 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
28e70 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
28e80 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
28e90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
28ea0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
28eb0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
28ec0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
28ed0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
28ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
28ef0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
28f00 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
28f10 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ze);.      IOTRA
28f20 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c  CE(("ZERO %p %d\
28f30 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
28f40 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
28f50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
28f60 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
28f70 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   );.      rc = r
28f80 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
28f90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28fa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28fb0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
28fc0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
28fd0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
28fe0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
28ff0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
29000 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
29010 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
29020 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  if.  }..  return
29030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
29040 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
29050 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
29060 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
29070 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
29080 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
29090 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
290a0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
290b0 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
290c0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
290d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
290e0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
290f0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
29100 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
29110 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
29120 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
29130 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
29140 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29150 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
29160 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
29170 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73  ot in cache. Als
29180 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20 74  o, return 0 if t
29190 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20  he .** pager is 
291a0 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  in PAGER_UNLOCK 
291b0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
291c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
291d0 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65  ed,.** or if the
291e0 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20   pager is in an 
291f0 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
29200 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
29210 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
29220 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
29230 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
29240 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
29250 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
29260 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
29270 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
29280 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
29290 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
292a0 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
292b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
292c0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
292d0 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
292e0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
292f0 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
29300 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
29310 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
29320 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
29330 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
29340 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
29350 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
29360 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
29370 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
29380 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  g = 0;.  assert(
29390 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
293a0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
293b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
293c0 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20  ger->pPCache!=0 
293d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
293e0 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50 41 47  ger->state > PAG
293f0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73  ER_UNLOCK );.  s
29400 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
29410 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
29420 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
29430 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
29440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
29450 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
29460 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
29470 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
29480 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
29490 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
294a0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
294b0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
294c0 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
294d0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
294e0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
294f0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
29500 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
29510 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
29520 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
29530 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
29540 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
29550 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
29560 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g){.  if( pPg ){
29570 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
29580 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
29590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
295a0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
295b0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
295c0 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
295d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
295e0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
295f0 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65  al file has alre
29600 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
29610 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
29620 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
29630 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f  file is open too
29640 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  . If the main jo
29650 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65  urnal is not ope
29660 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n,.** this funct
29670 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
29680 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
29690 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
296a0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
296b0 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
296c0 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f  . .** An SQLITE_
296d0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
296e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
296f0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a   if a call to .*
29700 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  * sqlite3OsOpen(
29710 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ) fails..*/.stat
29720 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
29730 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
29740 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
29750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
29760 28 20 28 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( (pagerUseWal(p
29770 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e  Pager) || isOpen
29780 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 29 20 26  (pPager->jfd)) &
29790 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
297a0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
297b0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
297c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
297d0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
297e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
297f0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
29800 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
29810 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
29820 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
29830 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
29840 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
29850 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
29860 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
29870 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
29880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
298a0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
298b0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
298c0 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
298d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
298e0 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
298f0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
29900 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
29910 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
29920 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
29930 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
29940 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
29950 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
29960 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
29970 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
29980 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
29990 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
299a0 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
299b0 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
299c0 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
299d0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
299e0 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
299f0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
29a00 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
29a10 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
29a20 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
29a30 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
29a40 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
29a50 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
29a60 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
29a70 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
29a80 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
29a90 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
29aa0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
29ab0 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
29ac0 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
29ad0 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
29ae0 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
29af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
29b00 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
29b10 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
29b20 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
29b30 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
29b40 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
29b50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
29b60 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
29b70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
29b80 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
29b90 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
29ba0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
29bb0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
29bc0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
29bd0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
29be0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
29bf0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
29c00 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
29c10 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
29c20 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
29c30 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
29c40 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
29c50 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
29c60 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
29c70 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
29c80 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
29c90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
29ca0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
29cb0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29cc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29cd0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
29ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29cf0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
29d00 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
29d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
29d30 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  ze of database f
29d40 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
29d50 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
29d60 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
29d70 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
29d80 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
29d90 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
29da0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
29db0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
29dc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29dd0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
29de0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29df0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
29e00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29e10 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72  E_OFF );.  asser
29e20 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
29e30 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
29e40 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
29e50 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
29e60 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
29e70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
29e80 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
29e90 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
29ea0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
29eb0 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
29ec0 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
29ed0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
29ee0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
29ef0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
29f00 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
29f10 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74 65  ->errCode;..  te
29f20 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
29f30 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
29f40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
29f50 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
29f60 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
29f70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29f80 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
29f90 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
29fa0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
29fb0 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  (nPage);.  if( p
29fc0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
29fd0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  l==0 ){.    retu
29fe0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
29ff0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
2a000 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2a010 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
2a020 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
2a030 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2a040 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2a050 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2a060 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2a070 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2a080 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RY ){.      sqli
2a090 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
2a0a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
2a0b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a0c0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
2a0d0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2a0e0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
2a0f0 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
2a100 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
2a110 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
2a120 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2a130 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
2a140 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
2a150 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
2a160 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
2a170 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
2a180 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
2a190 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20  OURNAL):.       
2a1a0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
2a1b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
2a1c0 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20        );.#ifdef 
2a1d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2a1e0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2a1f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
2a200 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
2a210 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
2a220 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
2a230 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
2a240 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
2a250 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a  Pager).      );.
2a260 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
2a270 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2a280 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2a290 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2a2a0 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
2a2b0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
2a2c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2a2d0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
2a2e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2a2f0 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65    }...  /* Write
2a300 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
2a310 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
2a320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
2a330 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65  d open .  ** the
2a340 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
2a350 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
2a360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a370 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f  _OK ){.    /* TO
2a380 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
2a390 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
2a3a0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
2a3b0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  /.    pPager->db
2a3c0 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
2a3d0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70  r->dbSize;.    p
2a3e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
2a3f0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  arted = 0;.    p
2a400 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2a410 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2a420 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  >nRec = 0;.    p
2a430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2a440 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
2a450 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
2a460 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
2a470 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
2a480 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
2a490 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
2a4a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2a4b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
2a4c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  r->nSavepoint ){
2a4d0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2a4e0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2a4f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
2a500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a510 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2a520 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
2a530 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
2a540 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2a550 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  al = 0;.  }.  re
2a560 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a570 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
2a580 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
2a590 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2a5a0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
2a5b0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
2a5c0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2a5d0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
2a5e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2a5f0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2a600 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
2a610 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
2a620 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
2a630 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
2a640 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
2a650 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2a660 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
2a670 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
2a680 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
2a690 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
2a6a0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
2a6b0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
2a6c0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
2a6d0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
2a6e0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
2a6f0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
2a700 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
2a710 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74  mory file and, t
2a720 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a730 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66  is .** opened if
2a740 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   it has not been
2a750 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20   already. For a 
2a760 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20  temporary file, 
2a770 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20  the opening .** 
2a780 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2a790 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
2a7a0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
2a7b0 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  n actual need to
2a7c0 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68   .** write to th
2a7d0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a  e journal. TODO:
2a7e0 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70   Why handle temp
2a7f0 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66  orary files diff
2a800 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49  erently?.**.** I
2a810 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2a820 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72  le is opened (or
2a830 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2a840 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a  y open), then a.
2a850 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  ** journal-heade
2a860 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
2a870 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
2a880 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
2a890 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
2a8a0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
2a8b0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
2a8c0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
2a8d0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
2a8e0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
2a8f0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
2a900 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
2a910 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
2a920 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
2a930 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
2a940 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
2a950 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
2a960 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2a970 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
2a980 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
2a990 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
2a9a0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
2a9b0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
2a9c0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
2a9d0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
2a9e0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
2a9f0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
2aa00 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
2aa10 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
2aa20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2aa30 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
2aa40 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
2aa50 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
2aa60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2aa70 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
2aa80 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
2aa90 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
2aaa0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
2aab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2aac0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2aad0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
2aae0 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  K );.  pPager->s
2aaf0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
2ab00 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
2ab10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2ab20 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
2ab30 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2ab40 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2ab50 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
2ab60 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
2ab70 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2ab80 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  e );..    if( pa
2ab90 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2aba0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 72  ) ){.      /* Gr
2abb0 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ab the write loc
2abc0 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  k on the log fil
2abd0 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
2abe0 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20  , upgrade to.   
2abf0 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c     ** PAGER_EXCL
2ac00 55 53 49 56 45 20 73 74 61 74 65 2e 20 4f 74 68  USIVE state. Oth
2ac10 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
2ac20 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
2ac30 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2ac40 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
2ac50 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
2ac60 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
2ac70 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
2ac80 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
2ac90 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
2aca0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
2acb0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
2acc0 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
2acd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2ace0 20 73 71 6c 69 74 65 33 57 61 6c 57 72 69 74 65   sqlite3WalWrite
2acf0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 70 57 61  Lock(pPager->pWa
2ad00 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 1);.      if(
2ad10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ad20 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2ad30 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
2ad40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2ad50 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
2ad60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
2ad70 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 70  ERVED;.        p
2ad80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2ad90 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  f = 0;.      }. 
2ada0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2adb0 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
2adc0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
2add0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2ade0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
2adf0 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
2ae00 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
2ae10 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
2ae20 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
2ae30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
2ae40 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
2ae50 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
2ae60 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
2ae70 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
2ae80 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
2ae90 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
2aea0 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
2aeb0 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
2aec0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
2aed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2aee0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
2aef0 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
2af00 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
2af10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2af20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
2af30 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
2af40 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69  ERVED;.        i
2af50 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
2af60 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2af70 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
2af80 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
2af90 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2afa0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2afb0 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
2afc0 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
2afd0 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 69 73  nal file at this
2afe0 20 74 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c 20   time.  It will 
2aff0 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64  be.    ** opened
2b000 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
2b010 69 74 74 65 6e 20 74 6f 2e 20 20 49 66 20 77 65  itten to.  If we
2b020 20 64 65 66 65 72 20 6f 70 65 6e 69 6e 67 20 74   defer opening t
2b030 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20 20  he journal,.    
2b040 2a 2a 20 77 65 20 6d 69 67 68 74 20 73 61 76 65  ** we might save
2b050 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72 65   the work of cre
2b060 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 66 20  ating a file if 
2b070 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
2b080 20 20 20 20 2a 2a 20 65 6e 64 73 20 75 70 20 62      ** ends up b
2b090 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  eing a no-op..  
2b0a0 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28    */.  }else if(
2b0b0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2b0c0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
2b0d0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
2b0e0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
2b0f0 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
2b100 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
2b110 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
2b120 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
2b130 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
2b140 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
2b150 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
2b160 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
2b170 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
2b180 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
2b190 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
2b1a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b1b0 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
2b1c0 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
2b1d0 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
2b1e0 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
2b1f0 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
2b200 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
2b210 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
2b220 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b230 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b240 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  er)==0 );.    as
2b250 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
2b260 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
2b270 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
2b280 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  rigSize==0 );.  
2b290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2b2a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
2b2b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
2b2c0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
2b2d0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50  Pager);.  }..  P
2b2e0 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
2b2f0 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
2b300 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2b310 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2b320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2b330 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62  ert( !pPager->db
2b340 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20  Modified );.    
2b350 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f  /* Ignore any IO
2b360 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
2b370 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  rs within pager_
2b380 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
2b390 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75  ). The.    ** pu
2b3a0 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
2b3b0 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74  ll is to reset t
2b3c0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
2b3d0 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20  e of the pager. 
2b3e0 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d     ** sub-system
2b3f0 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  . It doesn't mat
2b400 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ter if the journ
2b410 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  al-file is not p
2b420 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66  roperly.    ** f
2b430 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73  inalized at this
2b440 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74   point (since it
2b450 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
2b460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79  journal file any
2b470 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  way)..    */.   
2b480 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2b490 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
2b4a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b4b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
2b4c0 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
2b4d0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
2b4e0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
2b4f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2b500 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
2b510 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
2b520 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
2b530 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
2b540 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
2b550 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
2b560 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2b570 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
2b580 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
2b590 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
2b5a0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
2b5b0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
2b5c0 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
2b5d0 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
2b5e0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
2b5f0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
2b600 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
2b610 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
2b620 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
2b630 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
2b640 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2b650 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
2b660 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2b670 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2b680 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  e is not called 
2b690 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
2b6a0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2b6b0 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74   been.  ** start
2b6c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
2b6d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2b6e0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
2b6f0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   );..  /* If an 
2b700 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
2b710 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74  reviously detect
2b720 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73  ed, report the s
2b730 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61  ame error.  ** a
2b740 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
2b750 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2b760 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75 72  rrCode) )  retur
2b770 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2b780 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72 2d  e;..  /* Higher-
2b790 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 6e  level routines n
2b7a0 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20 66  ever call this f
2b7b0 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61 62  unction if datab
2b7c0 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ase is not.  ** 
2b7d0 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20 63  writable.  But c
2b7e0 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75 73  heck anyway, jus
2b7f0 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  t for robustness
2b800 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2b810 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c  (pPager->readOnl
2b820 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  y) ) return SQLI
2b830 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73 65  TE_PERM;..  asse
2b840 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
2b850 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
2b860 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
2b870 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2b880 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
2b890 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
2b8a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
2b8b0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
2b8c0 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
2b8d0 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
2b8e0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  way..  */.  sqli
2b8f0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
2b900 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
2b910 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
2b920 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72  ) && !subjRequir
2b930 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2b940 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
2b950 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2b960 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2b970 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
2b980 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
2b990 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
2b9a0 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
2b9b0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
2b9c0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
2b9d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
2b9e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
2b9f0 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
2ba00 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
2ba10 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
2ba20 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72 20  *.    ** Higher 
2ba30 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 73  level routines s
2ba40 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
2ba50 64 79 20 73 74 61 72 74 65 64 20 61 20 74 72 61  dy started a tra
2ba60 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a  nsaction,.    **
2ba70 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65   which means the
2ba80 79 20 68 61 76 65 20 61 63 71 75 69 72 65 64 20  y have acquired 
2ba90 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
2baa0 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f 6c 6c  cks but the roll
2bab0 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  back.    ** jour
2bac0 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65  nal might not ye
2bad0 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a  t be open..    *
2bae0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2baf0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 61  e3PagerBegin(pPa
2bb00 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ger, 0, pPager->
2bb10 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20  subjInMemory);. 
2bb20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bb30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2bb40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2bb50 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
2bb60 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
2bb70 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
2bb80 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2bb90 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2bba0 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 72 55  .     && !pagerU
2bbb0 73 65 57 61 6c 28 70 50 61 67 65 72 29 0a 20 20  seWal(pPager).  
2bbc0 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
2bbd0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2bbe0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 72  urnal );.      r
2bbf0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
2bc00 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2bc10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2bc20 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2bc30 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2bc40 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2bc50 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
2bc60 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
2bc70 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
2bc80 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
2bc90 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
2bca0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
2bcb0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
2bcc0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2bcd0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
2bce0 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
2bcf0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
2bd00 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
2bd10 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
2bd20 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
2bd30 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
2bd40 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73  urnal(pPg) && is
2bd50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2bd60 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
2bd70 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
2bd80 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
2bd90 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
2bda0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2bdb0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  ze ){.        u3
2bdc0 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
2bdd0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
2bde0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
2bdf0 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
2be00 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2be10 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
2be20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
2be30 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
2be40 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
2be50 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
2be60 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
2be70 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
2be80 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
2be90 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
2bea0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
2beb0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
2bec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2bed0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2bee0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
2bef0 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20  alOff );.       
2bf00 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2bf10 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2bf20 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2bf30 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
2bf40 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2bf50 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
2bf60 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
2bf70 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
2bf80 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2bf90 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2bfa0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
2bfb0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
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 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2bff0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
2c000 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2c010 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
2c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c030 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
2c040 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
2c050 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
2c060 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2c070 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
2c080 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
2c090 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
2c0a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c0b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
2c0c0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
2c0d0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
2c0e0 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
2c0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
2c100 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2c110 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
2c120 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
2c130 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
2c140 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
2c150 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2c170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2c180 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2c190 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
2c1a0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
2c1b0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2c1c0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
2c1d0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
2c1e0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
2c1f0 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
2c200 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
2c210 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2c220 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2c230 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2c240 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
2c250 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
2c260 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
2c270 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
2c280 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
2c290 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
2c2a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2c2b0 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
2c2c0 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
2c2d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
2c2e0 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
2c2f0 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
2c300 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
2c310 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
2c320 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
2c330 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2c340 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
2c350 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
2c360 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
2c370 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
2c380 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
2c390 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
2c3a0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
2c3b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2c3c0 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
2c3d0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2c3e0 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
2c3f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
2c400 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
2c410 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
2c420 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
2c430 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2c440 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
2c450 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
2c460 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
2c470 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
2c480 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2c490 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
2c4a0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
2c4b0 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  rred writing to 
2c4c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c4d0 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
2c4e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
2c4f0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
2c500 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
2c510 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
2c520 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2c530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c540 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c550 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
2c560 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
2c570 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
2c580 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
2c590 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
2c5a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c5b0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
2c5c0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2c5d0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
2c5e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
2c5f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2c600 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2c610 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2c620 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
2c630 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2c640 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
2c650 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2c660 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
2c670 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2c680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c690 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
2c6a0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
2c6b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
2c6c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2c6d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2c6e0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2c6f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
2c700 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
2c710 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
2c720 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2c730 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2c740 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2c750 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
2c760 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c770 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2c780 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
2c790 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
2c7a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c7b0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
2c7c0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
2c7e0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2c7f0 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
2c800 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2c810 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
2c820 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2c830 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
2c840 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2c850 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
2c860 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
2c870 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
2c880 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
2c890 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
2c8a0 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
2c8b0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
2c8c0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
2c8d0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
2c8e0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
2c8f0 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
2c900 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
2c910 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
2c920 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2c930 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2c940 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20  ge(pPg) ){.     
2c950 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2c960 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
2c970 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
2c980 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
2c990 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
2c9a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2c9b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2c9c0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
2c9d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2c9e0 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
2c9f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2ca00 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
2ca10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ca20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
2ca30 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
2ca40 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
2ca50 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
2ca60 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
2ca70 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
2ca80 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
2ca90 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
2caa0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
2cab0 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
2cac0 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
2cad0 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
2cae0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
2caf0 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
2cb00 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2cb10 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
2cb20 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
2cb30 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
2cb40 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
2cb50 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
2cb60 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
2cb70 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
2cb80 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
2cb90 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
2cba0 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
2cbb0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
2cbc0 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
2cbd0 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
2cbe0 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
2cbf0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
2cc00 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2cc10 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
2cc20 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2cc30 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2cc40 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
2cc50 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
2cc60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2cc70 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
2cc80 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
2cc90 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
2cca0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
2ccb0 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
2ccc0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
2ccd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2cce0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
2ccf0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
2cd00 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2cd10 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
2cd20 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
2cd30 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2cd40 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
2cd50 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65  e);..  if( nPage
2cd60 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
2cd70 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
2cd80 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
2cd90 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2cda0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
2cdb0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
2cdc0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
2cdd0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2cde0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
2cdf0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
2ce00 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
2ce10 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
2ce20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ce30 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
2ce40 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
2ce50 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
2ce60 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2ce70 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2ce80 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
2ce90 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
2cea0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ceb0 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73 20  if any page has 
2cec0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2ced0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  */..    /* Set t
2cee0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
2cef0 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
2cf00 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
2cf10 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
2cf20 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
2cf30 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
2cf40 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
2cf50 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
2cf60 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
2cf70 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
2cf80 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
2cf90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
2cfa0 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
2cfb0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2cfc0 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
2cfd0 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
2cfe0 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
2cff0 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
2d000 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
2d010 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
2d020 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
2d030 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
2d040 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
2d050 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
2d060 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
2d070 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
2d080 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
2d090 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
2d0a0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
2d0b0 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
2d0c0 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 72  -1)) + 1;..    r
2d0d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d0e0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2d0f0 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43  , (int *)&nPageC
2d100 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  ount);.    if( r
2d110 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2d120 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
2d130 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
2d140 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
2d150 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
2d160 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2d170 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
2d180 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
2d190 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
2d1a0 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
2d1b0 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
2d1c0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
2d1d0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
2d1e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
2d1f0 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
2d200 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
2d210 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
2d220 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
2d230 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
2d240 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
2d250 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2d260 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
2d270 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
2d280 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
2d290 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
2d2a0 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
2d2b0 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
2d2c0 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
2d2d0 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
2d2e0 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
2d2f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2d300 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
2d310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d320 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
2d330 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
2d340 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2d350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d360 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d370 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
2d380 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2d390 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
2d3a0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
2d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
2d3c0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
2d3d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d3e0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2d3f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
2d400 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2d410 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2d420 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2d430 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d440 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
2d450 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
2d460 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
2d470 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
2d480 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
2d490 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
2d4a0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
2d4b0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2d4c0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2d4d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
2d4e0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
2d4f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2d500 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
2d510 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
2d520 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
2d530 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
2d540 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
2d550 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
2d560 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
2d570 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
2d580 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
2d590 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
2d5a0 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
2d5b0 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
2d5c0 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
2d5d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
2d5e0 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
2d5f0 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
2d600 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
2d610 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
2d620 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
2d630 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
2d640 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
2d650 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2d660 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65  SQLITE_OK && nee
2d670 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
2d680 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
2d690 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
2d6a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
2d6b0 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b 20  ii=0; ii<nPage; 
2d6c0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
2d6d0 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
2d6e0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
2d6f0 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
2d700 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
2d710 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2d720 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2d730 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
2d740 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2d750 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2d760 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d770 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
2d780 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
2d790 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
2d7a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
2d7b0 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
2d7c0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2d7d0 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
2d7e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2d7f0 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
2d800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2d810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2d820 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
2d830 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
2d840 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
2d850 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
2d860 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2d870 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
2d880 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
2d890 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
2d8a0 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
2d8b0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2d8c0 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
2d8d0 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
2d8e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2d8f0 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
2d900 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
2d910 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2d920 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  RTY;.}.#endif../
2d930 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
2d940 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
2d950 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
2d960 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
2d970 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
2d980 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
2d990 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
2d9a0 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
2d9b0 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
2d9c0 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
2d9d0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2d9e0 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
2d9f0 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
2da00 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
2da10 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
2da20 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
2da30 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
2da40 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
2da50 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
2da60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
2da70 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
2da80 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
2da90 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
2daa0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
2dab0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
2dac0 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20   is unused. The 
2dad0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
2dae0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
2daf0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
2db00 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
2db10 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
2db20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
2db30 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
2db40 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20  n can quadruple 
2db50 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
2db60 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70  ge .** DELETE op
2db70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  erations..*/.voi
2db80 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
2db90 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70  ntWrite(PgHdr *p
2dba0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
2dbb0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2dbc0 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  er;.  if( (pPg->
2dbd0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2dbe0 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  Y) && pPager->nS
2dbf0 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
2dc00 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2dc10 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
2dc20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
2dc30 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
2dc40 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49  pPager)));.    I
2dc50 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
2dc60 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
2dc70 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
2dc80 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
2dc90 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
2dca0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
2dcb0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
2dcc0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
2dcd0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
2dce0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d  g);.#endif.  }.}
2dcf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2dd00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
2dd10 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
2dd20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
2dd30 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63  abase file .** c
2dd40 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73  hange-counter, s
2dd50 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74  tored as a 4-byt
2dd60 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2dd70 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74  eger starting at
2dd80 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74   .** byte offset
2dd90 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
2dda0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2ddb0 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
2ddc0 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74   flag is zero, t
2ddd0 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65  hen this is done
2dde0 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   by calling .** 
2ddf0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2de00 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74  e() on page 1, t
2de10 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
2de20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2de30 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20  e.** page data. 
2de40 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2de50 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70   file will be up
2de60 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63  dated when the c
2de70 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
2de80 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2de90 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
2dea0 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
2deb0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d  may only be non-
2dec0 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72  zero if the libr
2ded0 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
2dee0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c  .** with the SQL
2def0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2df00 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65  C_WRITE macro de
2df10 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  fined. In this c
2df20 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72  ase,.** if isDir
2df30 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ect is non-zero,
2df40 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
2df50 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74  se file is updat
2df60 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62  ed directly.** b
2df70 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64  y writing an upd
2df80 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
2df90 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63  page 1 using a c
2dfa0 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73  all to the .** s
2dfb0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
2dfc0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2dfd0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
2dfe0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2dff0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2e000 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65  int isDirectMode
2e010 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2e020 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44  LITE_OK;..  /* D
2e030 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69  eclare and initi
2e040 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69  alize constant i
2e050 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74  nteger 'isDirect
2e060 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61  '. If the.  ** a
2e070 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2e080 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62  mization is enab
2e090 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2e0a0 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74  d, then isDirect
2e0b0 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  .  ** is initial
2e0c0 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75  ized to the valu
2e0d0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2e0e0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72  isDirectMode par
2e0f0 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74  ameter.  ** to t
2e100 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74  his function. Ot
2e110 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61  herwise, it is a
2e120 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72  lways set to zer
2e130 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
2e140 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66   idea is that if
2e150 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2e160 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2e170 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c  s not.  ** enabl
2e180 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2e190 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  me, the compiler
2e1a0 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65   can omit the te
2e1b0 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44  sts of.  ** 'isD
2e1c0 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73  irect' below, as
2e1d0 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f   well as the blo
2e1e0 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74  ck enclosed in t
2e1f0 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44  he.  ** "if( isD
2e200 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69  irect )" conditi
2e210 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  on..  */.#ifndef
2e220 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2e230 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65  TOMIC_WRITE.# de
2e240 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
2e250 20 30 0a 20 20 61 73 73 65 72 74 28 20 69 73 44   0.  assert( isD
2e260 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a  irectMode==0 );.
2e270 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2e280 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29  ER(isDirectMode)
2e290 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ;.#else.# define
2e2a0 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44   DIRECT_MODE isD
2e2b0 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66  irectMode.#endif
2e2c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2e2d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2e2e0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
2e2f0 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
2e300 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70  geCountDone && p
2e310 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
2e320 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
2e330 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  gHdr;           
2e340 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
2e350 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
2e360 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f     u32 change_co
2e370 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  unter;          
2e380 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
2e390 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e  e of change-coun
2e3a0 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20  ter field */..  
2e3b0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2e3c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69  r->tempFile && i
2e3d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2e3e0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  ) );..    /* Ope
2e3f0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
2e400 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
2e410 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
2e420 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
2e430 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
2e440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e450 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d  PgHdr==0 || rc==
2e460 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
2e470 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65    /* If page one
2e480 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63   was fetched suc
2e490 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74  cessfully, and t
2e4a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2e4b0 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  not.    ** opera
2e4c0 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d  ting in direct-m
2e4d0 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31  ode, make page 1
2e4e0 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e   writable.  When
2e4f0 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20   not in .    ** 
2e500 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67  direct mode, pag
2e510 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65  e 1 is always he
2e520 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20  ld in cache and 
2e530 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47  hence the PagerG
2e540 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  et().    ** abov
2e550 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63  e is always succ
2e560 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74  essful - hence t
2e570 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d  he ALWAYS on rc=
2e580 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20  =SQLITE_OK..    
2e590 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45  */.    if( !DIRE
2e5a0 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59  CT_MODE && ALWAY
2e5b0 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  S(rc==SQLITE_OK)
2e5c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2e5d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e5e0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a  (pPgHdr);.    }.
2e5f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e610 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
2e620 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
2e630 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
2e640 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
2e650 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63  /.      change_c
2e660 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
2e670 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
2e680 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2e690 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  );.      change_
2e6a0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
2e6b0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
2e6c0 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61  r*)pPgHdr->pData
2e6d0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
2e6e0 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  nter);..      /*
2e6f0 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
2e700 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
2e710 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
2e720 36 2e 2e 39 39 20 2a 2f 0a 20 20 20 20 20 20 70  6..99 */.      p
2e730 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
2e740 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b  )pPgHdr->pData)+
2e750 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
2e760 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20  ON_NUMBER);..   
2e770 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
2e780 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   in direct mode,
2e790 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
2e7a0 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f  nts of page 1 to
2e7b0 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
2e7c0 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d      if( DIRECT_M
2e7d0 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ODE ){.        c
2e7e0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
2e7f0 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
2e800 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e810 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2e820 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
2e830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2e840 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2e850 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2e860 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2e870 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2e880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e890 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
2e8a0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
2e8b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e8d0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2e8e0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2e8f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2e900 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
2e910 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
2e920 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
2e930 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
2e940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2e960 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
2e970 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
2e980 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
2e990 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f  emory files.** o
2e9a0 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
2e9b0 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
2e9c0 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
2e9d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
2e9e0 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
2e9f0 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  r for which it i
2ea00 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a  s a no-op, this.
2ea10 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
2ea20 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
2ea30 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20  therwise, an IO 
2ea40 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2ea50 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
2ea60 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2ea70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ea80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eaa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2eab0 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
2eac0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
2ead0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2eae0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
2eaf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2eb00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2eb10 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2eb20 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2eb30 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
2eb40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2eb50 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
2eb60 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
2eb70 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
2eb80 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
2eb90 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
2eba0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
2ebb0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
2ebc0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
2ebd0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
2ebe0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
2ebf0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
2ec00 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
2ec10 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2ec20 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
2ec30 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
2ec40 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
2ec50 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
2ec60 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2ec70 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
2ec80 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2ec90 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
2eca0 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
2ecb0 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
2ecc0 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
2ecd0 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
2ece0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2ecf0 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
2ed00 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
2ed10 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
2ed20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2ed30 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
2ed40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ed50 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
2ed60 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
2ed70 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
2ed80 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
2ed90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
2eda0 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
2edb0 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
2edc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2edd0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
2ede0 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
2edf0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
2ee00 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
2ee10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
2ee20 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
2ee30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2ee40 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
2ee50 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
2ee60 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
2ee70 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
2ee80 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
2ee90 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
2eea0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
2eeb0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
2eec0 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
2eed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2eee0 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
2eef0 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
2ef00 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
2ef10 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2ef20 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
2ef30 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
2ef40 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
2ef50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
2ef60 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
2ef70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ef80 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2ef90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
2efa0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
2efb0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
2efc0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2efd0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2efe0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
2eff0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f010 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2f020 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2f030 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
2f040 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
2f050 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
2f060 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
2f070 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
2f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f090 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2f0a0 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
2f0b0 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
2f0c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2f0d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2f0e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2f0f0 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
2f100 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e   dbOrigSize is n
2f110 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72  ever set if jour
2f120 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a  nal_mode=OFF */.
2f130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f140 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2f150 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2f160 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e  _OFF || pPager->
2f170 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
2f180 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f  ..  /* If a prio
2f190 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  r error occurred
2f1a0 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72  , report that er
2f1b0 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ror again. */.  
2f1c0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2f1d0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2f1e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2f1f0 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  ode;..  PAGERTRA
2f200 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59  CE(("DATABASE SY
2f210 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
2f220 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c  ter=%s nSize=%d\
2f230 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
2f240 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
2f250 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  aster, pPager->d
2f260 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20  bSize));..  if( 
2f270 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2f280 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20  >dbModified ){. 
2f290 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2f2a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
2f2b0 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
2f2c0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
2f2d0 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20 20  to, or this.    
2f2e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
2f2f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2f300 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c  led, it is mostl
2f310 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65  y a no-op.  Howe
2f320 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20  ver, any.    ** 
2f330 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72 65  backup in progre
2f340 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ss needs to be r
2f350 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f  estarted..    */
2f360 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
2f370 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
2f380 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65  ->pBackup);.  }e
2f390 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
2f3a0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
2f3b0 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64  CED && pPager->d
2f3c0 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20  bModified ){.   
2f3d0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2f3e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2f3f0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d    PgHdr *pList =
2f400 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2f410 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2f420 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20  pPCache);.      
2f430 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2f440 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2f450 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2f460 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e   pList, pPager->
2f470 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20  dbSize, 1, .    
2f480 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
2f490 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67  >fullSync ? pPag
2f4a0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a  er->sync_flags :
2f4b0 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   0).        );. 
2f4c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2f4d0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
2f4e0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
2f4f0 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  he);.    }else{.
2f500 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
2f510 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64  lowing block upd
2f520 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
2f530 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79  counter. Exactly
2f540 20 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a   how it.      **
2f550 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65 6e   does this depen
2f560 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
2f570 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
2f580 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74  update optimizat
2f590 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ion.      ** was
2f5a0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
2f5b0 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66  ile time, and if
2f5c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2f5d0 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20  n meets the .   
2f5e0 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72     ** runtime cr
2f5f0 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68  iteria to use th
2f600 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20  e operation: .  
2f610 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2f620 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79     * The file-sy
2f630 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
2f640 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
2f650 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
2f660 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73    **      blocks
2f670 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69   of size page-si
2f680 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 2a  ze, and .      *
2f690 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d  *    * This comm
2f6a0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
2f6b0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
2f6c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
2f6d0 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78        **    * Ex
2f6e0 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68  actly one page h
2f6f0 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
2f700 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68   and store in th
2f710 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2f720 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2f730 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
2f740 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e  ation was not en
2f750 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2f760 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a   time, then the.
2f770 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69        ** pager_i
2f780 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2f790 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  r() function is 
2f7a0 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65  called to update
2f7b0 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20   the change.    
2f7c0 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20    ** counter in 
2f7d0 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e  'indirect-mode'.
2f7e0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
2f7f0 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64  tion is compiled
2f800 20 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a 2a   in but.      **
2f810 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62   is not applicab
2f820 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73  le to this trans
2f830 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c  action, call sql
2f840 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2f850 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  e().      ** to 
2f860 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f  make sure the jo
2f870 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61  urnal file has a
2f880 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65  ctually been cre
2f890 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a  ated, then call.
2f8a0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69        ** pager_i
2f8b0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2f8c0 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2f8d0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f8e0 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20   in indirect.   
2f8f0 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20     ** mode. .   
2f900 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
2f910 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
2f920 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2f930 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e   both enabled an
2f940 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20  d applicable,.  
2f950 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c      ** then call
2f960 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2f970 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2f980 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2f990 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 2a  -counter.      *
2f9a0 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f  * in 'direct' mo
2f9b0 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2f9c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f9d0 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a  e will never be.
2f9e0 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64        ** created
2f9f0 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
2fa00 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
2fa10 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
2fa20 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2fa30 49 54 45 0a 20 20 20 20 20 20 50 67 48 64 72 20  ITE.      PgHdr 
2fa40 2a 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73 65  *pPg;.      asse
2fa50 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2fa60 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
2fa70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2fa80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2fa90 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 20 20 69  E_OFF );.      i
2faa0 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
2fab0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2fac0 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  d) .       && pP
2fad0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2fae0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
2faf0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
2fb00 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
2fb10 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze>=pPager->dbFi
2fb20 6c 65 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26  leSize.       &&
2fb30 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
2fb40 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2fb50 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2fb60 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
2fb70 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b  pDirty).      ){
2fb80 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
2fb90 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
2fba0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
2fbb0 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
2fbc0 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
2fbd0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
2fbe0 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
2fbf0 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d  odify the in-mem
2fc00 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
2fc10 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20  on of page 1 .  
2fc20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c        ** to incl
2fc30 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20  ude the updated 
2fc40 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
2fc50 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
2fc60 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
2fc70 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
2fc80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2fc90 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
2fca0 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20  tomic-write .   
2fcb0 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
2fcc0 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
2fcd0 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
2fce0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20  s safe..        
2fcf0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
2fd00 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2fd10 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2fd20 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
2fd30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2fd40 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2fd50 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2fd60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2fd70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fd80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
2fd90 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2fda0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
2fdb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2fdc0 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20     }.  #else.   
2fdd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2fde0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2fdf0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 23  (pPager, 0);.  #
2fe00 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2fe10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2fe20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2fe30 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
2fe40 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
2fe50 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2fe60 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
2fe70 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
2fe80 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
2fe90 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
2fea0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
2feb0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
2fec0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2fed0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
2fee0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2fef0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
2ff00 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
2ff10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
2ff20 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
2ff30 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
2ff40 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
2ff50 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 20   than the .     
2ff60 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
2ff70 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
2ff80 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
2ff90 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
2ffa0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74        ** that it
2ffb0 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
2ffc0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
2ffd0 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2ffe0 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  , the.      ** c
2fff0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
30000 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e  agerGet() return
30010 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e   zeroed pages in
30020 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20 20  stead of .      
30030 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20  ** reading data 
30040 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30050 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
30060 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 6a  .      ** When j
30070 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46 46  ournal_mode==OFF
30080 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   the dbOrigSize 
30090 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c 20  is always zero, 
300a0 73 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  so this.      **
300b0 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e   block never run
300c0 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  s if journal_mod
300d0 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20 2a 2f 0a  e=OFF..      */.
300e0 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45    #ifndef SQLITE
300f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30100 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
30110 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72  r->dbSize<pPager
30120 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
30130 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70       && ALWAYS(p
30140 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
30150 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
30160 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 20  LMODE_OFF).     
30170 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
30180 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
30190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301a0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
301b0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
301c0 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
301d0 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
301e0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20  J_PGNO(pPager); 
301f0 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  /* Pending lock 
30200 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
30210 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a  const Pgno dbSiz
30220 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
30230 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ze;       /* Dat
30240 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65  abase image size
30250 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50 61   */ .        pPa
30260 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
30270 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
30280 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
30290 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50  =dbSize+1; i<=pP
302a0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
302b0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
302c0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
302d0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
302e0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
302f0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
30300 20 20 20 20 20 20 20 20 20 20 20 20 50 67 48 64              PgHd
30310 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  r *pPage;       
30320 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
30330 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
30340 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30350 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
30360 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
30370 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30390 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
303a0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
303b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
303c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
303d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
303e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
303f0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
30400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
30420 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
30430 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
30440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
30450 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
30460 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b  dbSize = dbSize;
30470 0a 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e 64  .      } .  #end
30480 69 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57  if.  .      /* W
30490 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
304a0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
304b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
304c0 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20  le. If a master 
304d0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
304e0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
304f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
30500 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
30510 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 20  nal file, .     
30520 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65   ** or if zMaste
30530 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61  r is NULL (no ma
30540 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74  ster journal), t
30550 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
30560 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20 20   a no-op..      
30570 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  */.      rc = wr
30580 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
30590 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
305a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
305b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
305c0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
305d0 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
305e0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
305f0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
30600 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
30610 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
30620 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
30630 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20  used, this call 
30640 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20  will not create 
30650 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30660 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a   or perform any.
30670 20 20 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f        ** real IO
30680 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30690 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
306a0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
306b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
306c0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
306d0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
306e0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  .  .      /* Wri
306f0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
30700 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
30710 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
30720 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
30730 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c 69  te_pagelist(sqli
30740 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
30750 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
30760 68 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  he));.      if( 
30770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30790 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
307a0 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  R_BLOCKED );.   
307b0 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74       goto commit
307c0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
307d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
307e0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
307f0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
30800 61 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20 20  ache);.  .      
30810 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  /* If the file o
30820 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68  n disk is not th
30830 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74  e same size as t
30840 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
30850 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  e,.      ** then
30860 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63   use pager_trunc
30870 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73  ate to grow or s
30880 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68  hrink the file h
30890 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ere..      */.  
308a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
308b0 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  dbSize!=pPager->
308c0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
308d0 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20        Pgno nNew 
308e0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
308f0 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69   - (pPager->dbSi
30900 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ze==PAGER_MJ_PGN
30910 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  O(pPager));.    
30920 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30930 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
30940 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
30950 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30960 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
30970 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
30980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30990 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
309a0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
309b0 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
309c0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
309d0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
309e0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  file. */.      i
309f0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
30a00 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
30a10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30a20 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
30a30 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
30a40 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
30a50 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
30a60 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
30a70 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
30a80 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  }..    pPager->s
30a90 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
30aa0 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74  CED;.  }..commit
30ab0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a  _phase_one_exit:
30ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30ad0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
30ae0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30af0 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
30b00 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
30b10 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
30b20 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
30b30 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
30b40 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
30b50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
30b60 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
30b70 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
30b80 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
30b90 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
30ba0 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
30bb0 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
30bc0 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
30bd0 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
30be0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
30bf0 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
30c00 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
30c10 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
30c20 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
30c30 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
30c40 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
30c50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
30c60 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
30c70 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
30c80 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
30c90 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
30ca0 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
30cb0 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
30cc0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
30cd0 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
30ce0 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
30cf0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
30d00 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
30d10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
30d20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
30d30 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
30d40 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
30d50 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
30d60 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
30d70 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
30d80 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
30d90 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
30da0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
30db0 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
30dc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
30dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30df0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30e00 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
30e10 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
30e20 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 61  t be called if a
30e30 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61 73   prior error has
30e40 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
30e50 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20 61  But if (due to a
30e60 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65 6c   coding error el
30e70 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 73  sewhere in the s
30e80 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20 67  ystem) it does g
30e90 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c 20  et.  ** called, 
30ea0 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
30eb0 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  same error code 
30ec0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
30ed0 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  ything. */.  if(
30ee0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
30ef0 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
30f00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
30f10 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
30f20 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
30f30 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68   be called if th
30f40 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
30f50 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20  n at least.  ** 
30f60 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
30f70 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64  tate. And indeed
30f80 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f   SQLite never do
30f90 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20  es this. But it 
30fa0 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20  is.  ** nice to 
30fb0 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73  have this defens
30fc0 69 76 65 20 74 65 73 74 20 68 65 72 65 20 61 6e  ive test here an
30fd0 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  yway..  */.  if(
30fe0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73   NEVER(pPager->s
30ff0 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
31000 56 45 44 29 20 29 20 72 65 74 75 72 6e 20 53 51  VED) ) return SQ
31010 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  LITE_ERROR;..  /
31020 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
31030 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
31040 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
31050 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
31060 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
31070 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
31080 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
31090 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
310a0 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
310b0 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
310c0 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
310d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
310e0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
310f0 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
31100 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31110 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
31120 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
31130 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
31140 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
31150 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
31160 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
31170 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
31180 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
31190 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
311a0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
311b0 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
311c0 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
311d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
311e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
311f0 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
31200 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
31210 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
31220 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
31230 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
31240 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
31250 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
31260 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
31270 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
31280 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50  odified==0 && pP
31290 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
312a0 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65  ode .   && pPage
312b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
312c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
312d0 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20  E_PERSIST.  ){. 
312e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
312f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
31300 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
31310 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74  ager) );.    ret
31320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
31330 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
31340 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
31350 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
31360 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
31370 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
31380 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
31390 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
313a0 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72  bModified );.  r
313b0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
313c0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
313d0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
313e0 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ter);.  return p
313f0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
31400 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
31410 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
31420 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61 62  anges. The datab
31430 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
31440 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
31450 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ode..**.** This 
31460 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
31470 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a  s two tasks:.**.
31480 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73  **   1) It rolls
31490 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61   back the journa
314a0 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e  l file, restorin
314b0 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  g all database f
314c0 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  ile and .**     
314d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
314e0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73 74   pages to the st
314f0 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69 6e  ate they were in
31500 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
31510 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61  ction.**      wa
31520 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a  s opened, and.**
31530 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a     2) It finaliz
31540 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
31550 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20  ile, so that it 
31560 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20  is not used for 
31570 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  hot.**      roll
31580 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e  back at any poin
31590 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
315a0 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74  .**.** subject t
315b0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
315c0 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a  qualifications:.
315d0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a  **.** * If the j
315e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
315f0 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e  ot yet open when
31600 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31610 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74  s called,.**   t
31620 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20  hen only (2) is 
31630 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68  performed. In th
31640 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
31650 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   no journal file
31660 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61  .**   to roll ba
31670 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69  ck..**.** * If i
31680 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
31690 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
316a0 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61  TE_FULL, then ta
316b0 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20  sk (1) is .**   
316c0 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75  performed. If su
316d0 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28  ccessful, task (
316e0 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  2). Regardless o
316f0 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a  f the outcome.**
31700 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68     of either, th
31710 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
31720 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
31730 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
31740 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69  er.**   (i.e. ei
31750 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
31760 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52  R or SQLITE_CORR
31770 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  UPT)..**.** * If
31780 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
31790 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
317a0 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
317b0 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65 72  mpt (1). Whether
317c0 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29  .**   or not (1)
317d0 20 69 73 20 73 75 63 63 75 73 73 66 75 6c 2c 20   is succussful, 
317e0 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29  also attempt (2)
317f0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
31800 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c   return.**   SQL
31810 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
31820 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  e, enter the err
31830 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
31840 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a  urn the first .*
31850 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65  *   error code e
31860 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a  ncountered. .**.
31870 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
31880 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  e there is no ch
31890 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64 61  ance that the da
318a0 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74 74  tabase was writt
318b0 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20  en to. .**   So 
318c0 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  is safe to final
318d0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
318e0 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65  file even if the
318f0 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20   playback .**   
31900 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61  (operation 1) fa
31910 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68  iled. However th
31920 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74  e pager must ent
31930 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
31940 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63  te.**   as the c
31950 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
31960 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61  n-memory cache a
31970 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a  re now suspect..
31980 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c  **.** * Finally,
31990 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43   if in PAGER_EXC
319a0 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
319b0 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
319c0 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70  Only.**   attemp
319d0 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73 20  t (2) if (1) is 
319e0 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75  successful. Retu
319f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
31a00 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20  successful,.**  
31a10 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65 72   otherwise enter
31a20 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
31a30 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
31a40 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
31a50 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e  the .**   failin
31a60 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  g operation..**.
31a70 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
31a80 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
31a90 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ile may have bee
31aa0 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f  n written to. So
31ab0 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61   if the.**   pla
31ac0 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
31ad0 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20  did not succeed 
31ae0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
31af0 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65  safe to finalize
31b00 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  .**   the journa
31b10 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73  l file. It needs
31b20 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74   to be left in t
31b30 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
31b40 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65  o that.**   some
31b50 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
31b60 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65 73  an use it to res
31b70 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
31b80 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20  e state (by.**  
31b90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
31ba0 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73  lback)..*/.int s
31bb0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
31bc0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
31bd0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
31be0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
31bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
31c00 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
31c10 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c  AGERTRACE(("ROLL
31c20 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
31c30 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
31c40 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
31c50 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
31c60 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 72 63  int rc2;..    rc
31c70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
31c80 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c  avepoint(pPager,
31c90 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
31ca0 41 43 4b 2c 20 2d 31 29 3b 0a 20 20 20 20 72 63  ACK, -1);.    rc
31cb0 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
31cc0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
31cd0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
31ce0 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
31cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
31d00 20 3d 20 72 63 32 3b 0a 20 20 7d 65 6c 73 65 20   = rc2;.  }else 
31d10 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d  if( !pPager->dbM
31d20 6f 64 69 66 69 65 64 20 7c 7c 20 21 69 73 4f 70  odified || !isOp
31d30 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31d40 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
31d50 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
31d60 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
31d70 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
31d80 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
31d90 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
31da0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
31db0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
31dc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
31dd0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
31de0 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67  IVE ){.      pag
31df0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
31e00 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
31e10 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
31e20 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  rrCode;.  }else{
31e30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
31e40 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
31e50 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20  SERVED ){.      
31e60 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72  int rc2;.      r
31e70 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
31e80 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
31e90 20 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72       rc2 = pager
31ea0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
31eb0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
31ec0 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20  >setMaster);.   
31ed0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31ef0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
31f00 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
31f10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
31f20 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
31f30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
31f40 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
31f50 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
31f60 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d  Valid = 0;.    }
31f70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65  ..    /* If an e
31f80 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
31f90 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
31fa0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
31fb0 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
31fc0 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f      ** cache. So
31fd0 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
31fe0 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
31ff0 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
32000 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72  rror .    ** per
32010 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  sistent..    */.
32020 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
32030 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
32040 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
32050 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
32060 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
32070 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
32080 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
32090 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
320a0 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
320b0 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
320c0 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75  ) writable..*/.u
320d0 38 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  8 sqlite3PagerIs
320e0 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
320f0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
32100 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
32110 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
32120 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
32130 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
32140 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
32150 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
32160 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
32170 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
32180 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
32190 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
321a0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
321b0 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
321c0 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72 20 6f  oximate number o
321d0 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
321e0 79 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75  y currently.** u
321f0 73 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72  sed by the pager
32200 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61   and its associa
32210 74 65 64 20 63 61 63 68 65 2e 0a 2a 2f 0a 69 6e  ted cache..*/.in
32220 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 65  t sqlite3PagerMe
32230 6d 55 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  mUsed(Pager *pPa
32240 67 65 72 29 7b 0a 20 20 69 6e 74 20 70 65 72 50  ger){.  int perP
32250 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
32260 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 70 50 61  ->pageSize + pPa
32270 67 65 72 2d 3e 6e 45 78 74 72 61 20 2b 20 32 30  ger->nExtra + 20
32280 3b 0a 20 20 72 65 74 75 72 6e 20 70 65 72 50 61  ;.  return perPa
32290 67 65 53 69 7a 65 2a 73 71 6c 69 74 65 33 50 63  geSize*sqlite3Pc
322a0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
322b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 0a 20  ager->pPCache). 
322c0 20 20 20 20 20 20 20 20 20 20 2b 20 73 71 6c 69            + sqli
322d0 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 50  te3MallocSize(pP
322e0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
322f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
32300 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
32310 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
32320 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
32330 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
32340 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70  fcount(DbPage *p
32350 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
32360 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
32370 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29  eRefcount(pPage)
32380 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
32390 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
323a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
323b0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
323c0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
323d0 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
323e0 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
323f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
32400 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
32410 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33    a[0] = sqlite3
32420 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32430 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
32440 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65  .  a[1] = sqlite
32450 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
32460 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
32470 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69  );.  a[2] = sqli
32480 74 65 33 50 63 61 63 68 65 47 65 74 43 61 63 68  te3PcacheGetCach
32490 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
324a0 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d  Cache);.  a[3] =
324b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
324c0 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61  alid ? (int) pPa
324d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31  ger->dbSize : -1
324e0 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
324f0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
32500 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
32510 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  de;.  a[6] = pPa
32520 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
32530 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
32540 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20  s;.  a[8] = 0;  
32550 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50  /* Used to be pP
32560 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20  ager->nOvfl */. 
32570 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
32580 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
32590 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
325a0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
325b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
325c0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
325d0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
325e0 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
325f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
32600 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  db(Pager *pPager
32610 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44  ){.  return MEMD
32620 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  B;.}../*.** Chec
32630 6b 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  k that there are
32640 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70   at least nSavep
32650 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20  oint savepoints 
32660 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61  open. If there a
32670 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
32680 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70  less than nSavep
32690 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e  oints open, then
326a0 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   open one or mor
326b0 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20  e savepoints.** 
326c0 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64  to make up the d
326d0 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68  ifference. If th
326e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  e number of save
326f0 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64  points is alread
32700 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53  y.** equal to nS
32710 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  avepoint, then t
32720 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32730 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
32740 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
32750 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c  ation fails, SQL
32760 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
32770 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
32780 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
32790 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ile opening the 
327a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
327b0 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72  , then an IO err
327c0 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65  or code is.** re
327d0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
327e0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
327f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
32800 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50  rOpenSavepoint(P
32810 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
32820 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t nSavepoint){. 
32830 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32840 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
32850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
32860 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
32870 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50  nt nCurrent = pP
32880 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
32890 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72  ;        /* Curr
328a0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  ent number of sa
328b0 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69  vepoints */..  i
328c0 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43  f( nSavepoint>nC
328d0 75 72 72 65 6e 74 20 26 26 20 70 50 61 67 65 72  urrent && pPager
328e0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
328f0 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
32900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32920 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
32930 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76   */.    PagerSav
32940 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20  epoint *aNew;   
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61  /* New Pager.aSa
32970 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f  vepoint array */
32980 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
32990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
329b0 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
329c0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
329d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
329e0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
329f0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66   &nPage);.    if
32a00 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32a10 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
32a20 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
32a30 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
32a40 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
32a50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
32a60 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
32a70 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
32a80 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
32a90 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
32aa0 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
32ab0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
32ac0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
32ad0 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
32ae0 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
32af0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
32b00 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
32b10 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
32b20 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
32b30 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
32b40 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
32b50 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
32b60 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
32b70 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
32b80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
32b90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
32ba0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
32bb0 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
32bc0 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
32bd0 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
32be0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
32bf0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
32c00 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
32c10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
32c20 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
32c30 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
32c40 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
32c50 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
32c60 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
32c70 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
32c80 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c  ii=nCurrent; ii<
32c90 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
32ca0 29 7b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  ){.      aNew[ii
32cb0 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61 67 65 3b  ].nOrig = nPage;
32cc0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
32cd0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
32ce0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
32cf0 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  lOff>0 ){.      
32d00 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
32d10 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
32d20 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d  rnalOff;.      }
32d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e  else{.        aN
32d40 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
32d50 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
32d60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
32d70 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
32d80 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72  iSubRec = pPager
32d90 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20  ->nSubRec;.     
32da0 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76   aNew[ii].pInSav
32db0 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33  epoint = sqlite3
32dc0 42 69 74 76 65 63 43 72 65 61 74 65 28 6e 50 61  BitvecCreate(nPa
32dd0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ge);.      if( !
32de0 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65  aNew[ii].pInSave
32df0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  point ){.       
32e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
32e10 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
32e20 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
32e30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
32e40 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
32e50 69 46 72 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  iFrame = sqlite3
32e60 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61  WalSavepoint(pPa
32e70 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
32e80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
32e90 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
32ea0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
32eb0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
32ec0 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ned. */.    rc =
32ed0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
32ee0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
32ef0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
32f00 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  raint(pPager);. 
32f10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
32f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
32f30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
32f40 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  d to rollback or
32f50 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74   release (commit
32f60 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ) a savepoint..*
32f70 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
32f80 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  to release or ro
32f90 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20  llback need not 
32fa0 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  be the most rece
32fb0 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64  ntly .** created
32fc0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
32fd0 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69  * Parameter op i
32fe0 73 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20  s always either 
32ff0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
33000 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  CK or SAVEPOINT_
33010 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69  RELEASE..** If i
33020 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
33030 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c  ELEASE, then rel
33040 65 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79  ease and destroy
33050 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77   the savepoint w
33060 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61  ith.** index iSa
33070 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69  vepoint. If it i
33080 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
33090 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62  BACK, then rollb
330a0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a  ack all changes.
330b0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63  ** that have occ
330c0 75 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20  urred since the 
330d0 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
330e0 69 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e  int was created.
330f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70  .**.** The savep
33100 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  oint to rollback
33110 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20 69   or release is i
33120 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
33130 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65  ameter .** iSave
33140 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f  point. A value o
33150 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65  f 0 means to ope
33160 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  rate on the oute
33170 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a  rmost savepoint.
33180 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20 63 72  ** (the first cr
33190 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20  eated). A value 
331a0 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  of (Pager.nSavep
331b0 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70  oint-1) means op
331c0 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20  erate.** on the 
331d0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72  most recently cr
331e0 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  eated savepoint.
331f0 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69   If iSavepoint i
33200 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  s greater than.*
33210 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  * (Pager.nSavepo
33220 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69  int-1), then thi
33230 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
33240 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
33250 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
33260 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
33270 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
33280 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
33290 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
332a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
332b0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74  s is different t
332c0 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  o calling .** sq
332d0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
332e0 63 6b 28 29 20 62 65 63 61 75 73 65 20 74 68 69  ck() because thi
332f0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
33300 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a  not terminate.**
33310 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
33320 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   or unlock the d
33330 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74  atabase, it just
33340 20 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a   restores the .*
33350 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
33360 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
33370 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
33380 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20  . .**.** In any 
33390 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f  case, all savepo
333a0 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64  ints with an ind
333b0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
333c0 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61  iSavepoint .** a
333d0 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66  re destroyed. If
333e0 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61   this is a relea
333f0 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70  se operation (op
33400 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
33410 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61  ASE),.** then sa
33420 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69  vepoint iSavepoi
33430 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72  nt is also destr
33440 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oyed..**.** This
33450 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
33460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33470 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  M if a memory al
33480 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
33490 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  ** or an IO erro
334a0 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20  r code if an IO 
334b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
334c0 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  le rolling back 
334d0 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  a .** savepoint.
334e0 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63   If no errors oc
334f0 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
33500 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a  s returned..*/ .
33510 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33520 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
33530 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c  *pPager, int op,
33540 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
33550 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33560 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
33570 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
33580 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
33590 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
335a0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
335b0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
335c0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
335d0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66  OLLBACK );..  if
335e0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61  ( iSavepoint<pPa
335f0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
33600 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  ){.    int ii;  
33610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
33620 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
33630 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20  /.    int nNew; 
33640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33650 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20  er of remaining 
33660 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72  savepoints after
33670 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20   this op. */..  
33680 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
33690 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69  how many savepoi
336a0 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62  nts will still b
336b0 65 20 61 63 74 69 76 65 20 61 66 74 65 72 20 74  e active after t
336c0 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  his.    ** opera
336d0 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73  tion. Store this
336e0 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20   value in nNew. 
336f0 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72  Then free resour
33700 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ces associated .
33710 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
33720 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
33730 61 72 65 20 64 65 73 74 72 6f 79 65 64 20 62 79  are destroyed by
33740 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
33750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77  .    */.    nNew
33760 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20   = iSavepoint + 
33770 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  (( op==SAVEPOINT
33780 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a  _RELEASE ) ? 0 :
33790 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   1);.    for(ii=
337a0 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d  nNew; ii<pPager-
337b0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
337c0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
337d0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
337e0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
337f0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
33800 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
33810 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
33820 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f  t = nNew;..    /
33830 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
33840 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
33850 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
33860 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
33870 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
33880 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  nal to zero byte
33890 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
338a0 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
338b0 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20  INT_RELEASE ){. 
338c0 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30       if( nNew==0
338d0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
338e0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
338f0 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e      /* Only trun
33900 63 61 74 65 20 69 66 20 69 74 20 69 73 20 61 6e  cate if it is an
33910 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a   in-memory sub-j
33920 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
33930 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
33940 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
33950 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
33960 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33970 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
33980 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20  ger->sjfd, 0);. 
33990 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
339a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
339b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
339c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62      pPager->nSub
339d0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Rec = 0;.      }
339e0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c  .    }.    /* El
339f0 73 65 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  se this is a rol
33a00 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
33a10 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
33a20 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
33a30 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
33a40 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
33a50 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
33a60 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
33a70 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
33a80 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
33a90 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
33aa0 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
33ab0 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
33ac0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
33ad0 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
33ae0 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
33af0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
33b00 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
33b10 20 65 6c 73 65 20 69 66 28 20 70 61 67 65 72 55   else if( pagerU
33b20 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
33b30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
33b40 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61  jfd) ){.      Pa
33b50 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
33b60 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77  avepoint = (nNew
33b70 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e  ==0)?0:&pPager->
33b80 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d  aSavepoint[nNew-
33b90 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  1];.      rc = p
33ba0 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
33bb0 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53  point(pPager, pS
33bc0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
33bd0 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49   assert(rc!=SQLI
33be0 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a  TE_DONE);.    }.
33bf0 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20    .  }.  return 
33c00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
33c10 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
33c20 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
33c30 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
33c40 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
33c50 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
33c60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33c70 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
33c80 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  >zFilename;.}../
33c90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33ca0 56 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f  VFS structure fo
33cb0 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  r the pager..*/.
33cc0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66  const sqlite3_vf
33cd0 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56  s *sqlite3PagerV
33ce0 66 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  fs(Pager *pPager
33cf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
33d00 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a  er->pVfs;.}../*.
33d10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
33d20 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
33d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33d40 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
33d50 74 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  th the pager.  T
33d60 68 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  his might return
33d70 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c   NULL if the fil
33d80 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74  e has.** not yet
33d90 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f   been opened..*/
33da0 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73  .sqlite3_file *s
33db0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
33dc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33dd0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
33de0 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >fd;.}../*.** Re
33df0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
33e00 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
33e10 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
33e20 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
33e30 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
33e40 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
33e50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
33e60 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
33e70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
33e80 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
33e90 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
33ea0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
33eb0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
33ec0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
33ed0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
33ee0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
33ef0 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
33f00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33f10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
33f20 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
33f30 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
33f40 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20  EC./*.** Set or 
33f50 72 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 64  retrieve the cod
33f60 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
33f70 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
33f80 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
33f90 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
33fa0 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
33fb0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
33fc0 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
33fd0 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
33fe0 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
33ff0 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  int,int),.  void
34000 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76   (*xCodecFree)(v
34010 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70  oid*),.  void *p
34020 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70  Codec.){.  if( p
34030 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
34040 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
34050 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
34060 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72  Codec);.  pPager
34070 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67 65  ->xCodec = pPage
34080 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78  r->memDb ? 0 : x
34090 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
340a0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
340b0 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  = xCodecSizeChng
340c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  ;.  pPager->xCod
340d0 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46  ecFree = xCodecF
340e0 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ree;.  pPager->p
340f0 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a  Codec = pCodec;.
34100 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
34110 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61  e(pPager);.}.sta
34120 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  tic void *sqlite
34130 33 50 61 67 65 72 47 65 74 43 6f 64 65 63 28 50  3PagerGetCodec(P
34140 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
34150 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
34160 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66  pCodec;.}.#endif
34170 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
34180 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
34190 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
341a0 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61  page pPg to loca
341b0 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
341c0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
341d0 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
341e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
341f0 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
34200 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67  located at.** pg
34210 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c  no (which we cal
34220 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68  l pPgOld) though
34230 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c   that page is al
34240 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69  lowed to be.** i
34250 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65  n cache.  If the
34260 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
34270 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
34280 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
34290 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
342a0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
342b0 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
342c0 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
342d0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
342e0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
342f0 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
34300 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
34310 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
34320 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
34330 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
34340 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
34350 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
34360 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
34370 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
34380 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
34390 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
343a0 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
343b0 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
343c0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
343d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
343e0 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
343f0 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
34400 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
34410 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
34420 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
34430 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
34440 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
34450 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
34460 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
34470 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
34480 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
34490 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a   is active)..**.
344a0 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68  ** If the fourth
344b0 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d   argument, isCom
344c0 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mit, is non-zero
344d0 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
344e0 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76   is being.** mov
344f0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
34500 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e  database reorgan
34510 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66  ization just bef
34520 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
34530 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67  ion .** is being
34540 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74   committed. In t
34550 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20  his case, it is 
34560 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
34570 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
34580 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73  e .** pPg refers
34590 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   to will not be 
345a0 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e  written to again
345b0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
345c0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
345d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
345e0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
345f0 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
34600 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
34610 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
34620 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
34630 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
34640 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
34650 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
34660 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
34670 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
34680 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69  gno, int isCommi
34690 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  t){.  PgHdr *pPg
346a0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
346b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62     /* The page b
346c0 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
346d0 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64  . */.  Pgno need
346e0 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20  SyncPgno = 0;   
346f0 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65      /* Old value
34700 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69   of pPg->pgno, i
34710 66 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  f sync is requir
34720 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ed */.  int rc; 
34730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34740 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
34750 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72  ode */.  Pgno or
34760 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  igPgno;         
34770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69        /* The ori
34780 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  ginal page numbe
34790 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
347a0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
347b0 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    /* In order to
347c0 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
347d0 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d 6f  back, an in-memo
347e0 72 79 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  ry database must
347f0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74 68   journal.  ** th
34800 65 20 70 61 67 65 20 77 65 20 61 72 65 20 6d 6f  e page we are mo
34810 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a  ving from..  */.
34820 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
34830 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34840 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
34850 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
34860 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
34870 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65  * If the page be
34880 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72  ing moved is dir
34890 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62  ty and has not b
348a0 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65  een saved by the
348b0 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76   latest.  ** sav
348c0 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76  epoint, then sav
348d0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
348e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
348f0 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a  ge into the .  *
34900 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f  * sub-journal no
34910 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  w. This is requi
34920 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  red to handle th
34930 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e  e following scen
34940 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ario:.  **.  ** 
34950 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20    BEGIN;.  **   
34960 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
34970 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69  X, then modify i
34980 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a  t in memory>.  *
34990 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
349a0 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20  one;.  **       
349b0 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20  <Move page X to 
349c0 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a  location Y>.  **
349d0 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
349e0 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
349f0 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e  If page X were n
34a00 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
34a10 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65  e sub-journal he
34a20 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  re, it would not
34a30 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c  .  ** be possibl
34a40 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73  e to restore its
34a50 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74   contents when t
34a60 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
34a70 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d  one".  ** statem
34a80 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63  ent were is proc
34a90 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  essed..  **.  **
34aa0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
34ab0 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c  ) may need to al
34ac0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20  locate space to 
34ad0 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20  store pPg->pgno 
34ae0 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72  into.  ** one or
34af0 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20   more savepoint 
34b00 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73  bitvecs. This is
34b10 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73   the reason this
34b20 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d   function.  ** m
34b30 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
34b40 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69  _NOMEM..  */.  i
34b50 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
34b60 48 44 52 5f 44 49 52 54 59 0a 20 20 20 26 26 20  HDR_DIRTY.   && 
34b70 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
34b80 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49  (pPg).   && SQLI
34b90 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62  TE_OK!=(rc = sub
34ba0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
34bb0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
34bc0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
34bd0 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  ERTRACE(("MOVE %
34be0 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
34bf0 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
34c00 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
34c10 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
34c20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d  pPg->pgno, (pPg-
34c30 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34c40 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e  D_SYNC)?1:0, pgn
34c50 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  o));.  IOTRACE((
34c60 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
34c70 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
34c80 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
34c90 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
34ca0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
34cb0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61  nc()ed before pa
34cc0 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e  ge pPg->pgno can
34cd0 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
34ce0 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e   to, store pPg->
34cf0 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61  pgno in local va
34d00 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50  riable needSyncP
34d10 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gno..  **.  ** I
34d20 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  f the isCommit f
34d30 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72  lag is set, ther
34d40 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
34d50 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20  remember that.  
34d60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
34d70 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
34d80 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
34d90 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ase page pPg->pg
34da0 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  no .  ** can be 
34db0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
34dc0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
34dd0 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
34de0 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
34df0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d    */.  if( (pPg-
34e00 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
34e10 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f  D_SYNC) && !isCo
34e20 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64  mmit ){.    need
34e30 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
34e40 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
34e50 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
34e60 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
34e70 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
34e80 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
34e90 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
34ea0 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20  GHDR_DIRTY );.  
34eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34ec0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
34ed0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
34ee0 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
34ef0 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
34f00 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
34f10 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
34f20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  its hash chain. 
34f30 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
34f40 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
34f50 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
34f60 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
34f70 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
34f80 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
34f90 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
34fa0 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
34fb0 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
34fc0 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26  /.  pPg->flags &
34fd0 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  = ~PGHDR_NEED_SY
34fe0 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70  NC;.  pPgOld = p
34ff0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
35000 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
35010 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20  ert( !pPgOld || 
35020 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20  pPgOld->nRef==1 
35030 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
35040 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  ){.    pPg->flag
35050 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c  s |= (pPgOld->fl
35060 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
35070 59 4e 43 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  YNC);.    if( ME
35080 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MDB ){.      /* 
35090 44 6f 20 6e 6f 74 20 64 69 73 63 61 72 64 20 70  Do not discard p
350a0 61 67 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e 2d  ages from an in-
350b0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
350c0 73 69 6e 63 65 20 77 65 20 6d 69 67 68 74 0a 20  since we might. 
350d0 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
350e0 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e 20  rollback later. 
350f0 20 4a 75 73 74 20 6d 6f 76 65 20 74 68 65 20 70   Just move the p
35100 61 67 65 20 6f 75 74 20 6f 66 20 74 68 65 20 77  age out of the w
35110 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ay. */.      ass
35120 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
35130 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
35140 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
35150 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70 50 61 67  ove(pPgOld, pPag
35160 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a 20  er->dbSize+1);. 
35170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35180 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
35190 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 7d  p(pPgOld);.    }
351a0 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f  .  }..  origPgno
351b0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
351c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
351d0 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20  e(pPg, pgno);.  
351e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
351f0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70  eDirty(pPg);.  p
35200 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
35210 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  d = 1;..  if( ne
35220 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
35230 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
35240 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
35250 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
35260 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
35270 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
35280 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
35290 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
352a0 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
352b0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
352c0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
352d0 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
352e0 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
352f0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
35300 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20  the .    ** "is 
35310 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65  journaled" bitve
35320 63 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20  c flag has been 
35330 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
35340 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
35350 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67  y.    ** loading
35360 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
35370 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
35380 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
35390 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20  gHdr.needSync . 
353a0 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20     ** flag..    
353b0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
353c0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
353d0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
353e0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61  he page-cache fa
353f0 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a  ils, (due.    **
35400 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   to a malloc() o
35410 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63  r IO failure), c
35420 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20  lear the bit in 
35430 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d  the pInJournal[]
35440 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f  .    ** array. O
35450 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
35460 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
35470 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69  and written agai
35480 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  n in.    ** this
35490 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
354a0 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
354b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
354c0 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20  file before.    
354d0 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  ** it is synced 
354e0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
354f0 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c   file. This way,
35500 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69   it may end up i
35510 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
35520 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c  rnal file twice,
35530 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74   but that is not
35540 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20   a problem..    
35550 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
35560 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
35570 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
35580 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
35590 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
355a0 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
355b0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
355c0 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
355d0 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  */.    PgHdr *pP
355e0 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74  gHdr;.    assert
355f0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
35600 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
35610 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
35620 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
35630 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  gno, &pPgHdr);. 
35640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
35660 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d  ( needSyncPgno<=
35670 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
35680 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ze ){.        as
35690 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54  sert( pPager->pT
356a0 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20  mpSpace!=0 );.  
356b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
356c0 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d  vecClear(pPager-
356d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65  >pInJournal, nee
356e0 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65  dSyncPgno, pPage
356f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
35700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
35710 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
35720 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
35730 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  nc = 1;.    asse
35740 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  rt( pPager->noSy
35750 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  nc==0 && !MEMDB 
35760 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66  );.    pPgHdr->f
35770 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
35780 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c  ED_SYNC;.    sql
35790 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
357a0 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
357b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
357c0 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
357d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61  .  /*.  ** For a
357e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
357f0 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  base, make sure 
35800 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
35810 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a  e continues.  **
35820 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61   to exist, in ca
35830 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
35840 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c  on needs to roll
35850 20 62 61 63 6b 2e 20 20 55 73 65 20 70 50 67 4f   back.  Use pPgO
35860 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 6f  ld.  ** as the o
35870 72 69 67 69 6e 61 6c 20 70 61 67 65 20 73 69 6e  riginal page sin
35880 63 65 20 69 74 20 68 61 73 20 61 6c 72 65 61 64  ce it has alread
35890 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
358a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
358b0 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  DB ){.    sqlite
358c0 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f  3PcacheMove(pPgO
358d0 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20  ld, origPgno);. 
358e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
358f0 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20 20  nref(pPgOld);.  
35900 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
35910 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
35920 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
35930 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
35940 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
35950 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
35960 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
35970 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
35980 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
35990 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20   pPg->nRef>0 || 
359a0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
359b0 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Db );.  return p
359c0 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  Pg->pData;.}../*
359d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
359e0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
359f0 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
35a00 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
35a10 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
35a20 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
35a30 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
35a40 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
35a50 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
35a60 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
35a70 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d  n pPg->pExtra;.}
35a80 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
35a90 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
35aa0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
35ab0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
35ac0 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
35ad0 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
35ae0 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
35af0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
35b00 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
35b10 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
35b20 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
35b30 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
35b40 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
35b50 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
35b60 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
35b70 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
35b80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
35b90 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
35ba0 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
35bb0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
35bc0 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
35bd0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
35be0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
35bf0 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
35c00 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
35c10 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
35c20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
35c30 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
35c40 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
35c50 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
35c60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
35c70 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
35c80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
35c90 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
35ca0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
35cb0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
35cc0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
35cd0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
35ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
35cf0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
35d00 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
35d10 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
35d20 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
35d30 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
35d40 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
35d50 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
35d60 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
35d70 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
35d80 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
35d90 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
35da0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
35db0 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
35dc0 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  usiveMode;.}../*
35dd0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
35de0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72  journal-mode for
35df0 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
35e00 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
35e10 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  t be one of:.**.
35e20 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
35e30 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a  NALMODE_QUERY.**
35e40 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
35e50 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  LMODE_DELETE.** 
35e60 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
35e70 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a  MODE_TRUNCATE.**
35e80 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
35e90 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a  LMODE_PERSIST.**
35ea0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
35eb0 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20  LMODE_OFF.**    
35ec0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35ed0 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 50  E_MEMORY.**    P
35ee0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35ef0 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _WAL.**.** If th
35f00 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
35f10 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
35f20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
35f30 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
35f40 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
35f50 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20  d if the change 
35f60 69 73 20 61 6c 6c 6f 77 65 64 2e 20 54 68 65 20  is allowed. The 
35f70 63 68 61 6e 67 65 20 6d 61 79 20 62 65 20 64 69  change may be di
35f80 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20  sallowed.** for 
35f90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  the following re
35fa0 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  asons:.**.**   *
35fb0 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    An in-memory d
35fc0 61 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79  atabase can only
35fd0 20 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61   have its journa
35fe0 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f  l_mode set to _O
35ff0 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d  FF.**      or _M
36000 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  EMORY..**.**   *
36010 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f    The journal mo
36020 64 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68  de may not be ch
36030 61 6e 67 65 64 20 77 68 69 6c 65 20 61 20 74 72  anged while a tr
36040 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
36050 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ive..**.** The r
36060 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65  eturned indicate
36070 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
36080 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20  ssibly updated) 
36090 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f  journal-mode..*/
360a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
360b0 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67  rJournalMode(Pag
360c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
360d0 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
360e0 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
360f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
36100 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36110 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
36120 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
36130 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
36140 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
36150 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
36160 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36170 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
36180 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
36190 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
361a0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
361b0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
361c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
361d0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
361e0 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
361f0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
36200 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
36210 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61  DE_MEMORY );.  a
36220 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
36230 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30  RNALMODE_QUERY<0
36240 20 29 3b 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65   );..  if( eMode
36250 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36260 4f 44 45 5f 57 41 4c 20 0a 20 20 20 26 26 20 70  ODE_WAL .   && p
36270 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
36280 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
36290 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 29  LMODE_DELETE.  )
362a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
362b0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
362c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
362d0 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  L;.  }else if( e
362e0 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20 28 70  Mode>=0.   && (p
362f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
36300 3d 30 20 7c 7c 20 65 4d 6f 64 65 21 3d 50 41 47  =0 || eMode!=PAG
36310 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
36320 41 4c 29 0a 20 20 20 26 26 20 28 21 4d 45 4d 44  AL).   && (!MEMD
36330 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45  B || eMode==PAGE
36340 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
36350 4d 4f 52 59 7c 7c 65 4d 6f 64 65 3d 3d 50 41 47  MORY||eMode==PAG
36360 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
36370 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67 65  FF).   && !pPage
36380 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20  r->dbModified.  
36390 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61   && (!isOpen(pPa
363a0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d  ger->jfd) || 0==
363b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
363c0 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ff).  ){.    if(
363d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
363e0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71  jfd) ){.      sq
363f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
36400 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
36410 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
36420 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36430 54 52 55 4e 43 41 54 45 20 26 20 31 29 3d 3d 31  TRUNCATE & 1)==1
36440 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36450 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
36460 44 45 5f 50 45 52 53 49 53 54 20 26 20 31 29 3d  DE_PERSIST & 1)=
36470 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
36480 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
36490 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 31 29  MODE_DELETE & 1)
364a0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
364b0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
364c0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 31  LMODE_MEMORY & 1
364d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
364e0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
364f0 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 31 29 3d  ALMODE_OFF & 1)=
36500 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
36510 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
36520 64 65 20 26 20 31 29 3d 3d 31 20 26 26 20 28 65  de & 1)==1 && (e
36530 4d 6f 64 65 20 26 20 31 29 3d 3d 30 0a 20 20 20  Mode & 1)==0.   
36540 20 20 20 20 20 20 26 26 20 21 70 50 61 67 65 72        && !pPager
36550 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
36560 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
36570 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
36580 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
36590 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
365a0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
365b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75  journalMode = (u
365c0 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  8)eMode;.  }.  r
365d0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
365e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
365f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
36600 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
36610 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
36620 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
36630 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67  s..**.** Setting
36640 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20   the size limit 
36650 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c  to -1 means no l
36660 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64  imit is enforced
36670 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20  ..** An attempt 
36680 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73  to set a limit s
36690 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69  maller than -1 i
366a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36  s a no-op..*/.i6
366b0 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  4 sqlite3PagerJo
366c0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50  urnalSizeLimit(P
366d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36  ager *pPager, i6
366e0 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28  4 iLimit){.  if(
366f0 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20   iLimit>=-1 ){. 
36700 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36710 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c  alSizeLimit = iL
36720 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
36730 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  rn pPager->journ
36740 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a  alSizeLimit;.}..
36750 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
36760 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50  ointer to the pP
36770 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61  ager->pBackup va
36780 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b  riable. The back
36790 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20  up module.** in 
367a0 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69  backup.c maintai
367b0 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ns the content o
367c0 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e  f this variable.
367d0 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20   This module.** 
367e0 75 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79  uses it opaquely
367f0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
36800 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  to sqlite3Backup
36810 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a  Restart() and.**
36820 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
36830 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a  date() only..*/.
36840 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
36850 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42 61 63  *sqlite3PagerBac
36860 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a 70 50  kupPtr(Pager *pP
36870 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
36880 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  &pPager->pBackup
36890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
368a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
368b0 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
368c0 20 69 6e 76 6f 6b 65 73 20 22 50 52 41 47 4d 41   invokes "PRAGMA
368d0 20 63 68 65 63 6b 70 6f 69 6e 74 22 2e 0a 2a 2f   checkpoint"..*/
368e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
368f0 72 43 68 65 63 6b 70 6f 69 6e 74 28 50 61 67 65  rCheckpoint(Page
36900 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
36910 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36920 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
36930 70 57 61 6c 20 29 7b 0a 20 20 20 20 75 38 20 2a  pWal ){.    u8 *
36940 7a 42 75 66 20 3d 20 28 75 38 20 2a 29 70 50 61  zBuf = (u8 *)pPa
36950 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
36960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36970 57 61 6c 43 68 65 63 6b 70 6f 69 6e 74 28 70 50  WalCheckpoint(pP
36980 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67  ager->pWal, pPag
36990 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
369a0 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
369b0 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73   ? 0 : pPager->s
369c0 79 6e 63 5f 66 6c 61 67 73 29 2c 0a 20 20 20 20  ync_flags),.    
369d0 20 20 20 20 7a 42 75 66 2c 20 70 50 61 67 65 72      zBuf, pPager
369e0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  ->xBusyHandler, 
369f0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
36a00 64 6c 65 72 41 72 67 0a 20 20 20 20 29 3b 0a 20  dlerArg.    );. 
36a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36a20 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  }..int sqlite3Pa
36a30 67 65 72 57 61 6c 43 61 6c 6c 62 61 63 6b 28 50  gerWalCallback(P
36a40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
36a50 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 57   return sqlite3W
36a60 61 6c 43 61 6c 6c 62 61 63 6b 28 70 50 61 67 65  alCallback(pPage
36a70 72 2d 3e 70 57 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  r->pWal);.}../*.
36a80 2a 2a 20 4f 70 65 6e 20 61 20 63 6f 6e 6e 65 63  ** Open a connec
36a90 74 69 6f 6e 20 74 6f 20 74 68 65 20 77 72 69 74  tion to the writ
36aa0 65 2d 61 68 65 61 64 20 6c 6f 67 20 66 69 6c 65  e-ahead log file
36ab0 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
36ac0 72 2e 20 49 66 0a 2a 2a 20 74 68 65 20 6c 6f 67  r. If.** the log
36ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61   connection is a
36ae0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
36af0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
36b00 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  no-op..**.** The
36b10 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 62 65 20   caller must be 
36b20 68 6f 6c 64 69 6e 67 20 61 20 53 48 41 52 45 44  holding a SHARED
36b30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36b40 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
36b50 6c 6c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ll.** this funct
36b60 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
36b70 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
36b80 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
36b90 6e 74 20 2a 70 69 73 4f 70 65 6e 29 7b 0a 20 20  nt *pisOpen){.  
36ba0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
36bb0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
36bc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
36bd0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
36be0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
36bf0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
36c00 28 20 21 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  ( !pPager->pWal 
36c10 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
36c20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
36c30 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  o the log file. 
36c40 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  If this operatio
36c50 6e 20 66 61 69 6c 73 2c 20 0a 20 20 20 20 2a 2a  n fails, .    **
36c60 20 28 65 2e 67 2e 20 64 75 65 20 74 6f 20 6d 61   (e.g. due to ma
36c70 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 29 2c  lloc() failure),
36c80 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
36c90 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 20  base file and . 
36ca0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
36cb0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
36cc0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
36cd0 74 65 33 57 61 6c 4f 70 65 6e 28 70 50 61 67 65  te3WalOpen(pPage
36ce0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
36cf0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 70 50 61  >zFilename, &pPa
36d00 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
36d10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36d20 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
36d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
36d40 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
36d50 44 45 5f 57 41 4c 3b 0a 20 20 20 20 7d 0a 20 20  DE_WAL;.    }.  
36d60 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 69 73 4f  }else{.    *pisO
36d70 70 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  pen = 1;.  }..  
36d80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
36d90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
36da0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
36db0 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65 63  close the connec
36dc0 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tion to the log 
36dd0 66 69 6c 65 20 70 72 69 6f 72 0a 2a 2a 20 74 6f  file prior.** to
36de0 20 73 77 69 74 63 68 69 6e 67 20 66 72 6f 6d 20   switching from 
36df0 57 41 4c 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  WAL to rollback 
36e00 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  mode..**.** Befo
36e10 72 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 6c  re closing the l
36e20 6f 67 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  og file, this fu
36e30 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
36e40 74 6f 20 74 61 6b 65 20 61 6e 20 0a 2a 2a 20 45  to take an .** E
36e50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
36e60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36e70 6c 65 2e 20 49 66 20 74 68 69 73 20 63 61 6e 6e  le. If this cann
36e80 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ot be obtained, 
36e90 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 28 53 51 4c  an.** error (SQL
36ea0 49 54 45 5f 42 55 53 59 29 20 69 73 20 72 65 74  ITE_BUSY) is ret
36eb0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  urned and the lo
36ec0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  g connection is 
36ed0 6e 6f 74 20 63 6c 6f 73 65 64 2e 0a 2a 2a 20 49  not closed..** I
36ee0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
36ef0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
36f00 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73 65 64   is not released
36f10 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
36f20 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
36f30 33 50 61 67 65 72 43 6c 6f 73 65 57 61 6c 28 50  3PagerCloseWal(P
36f40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
36f50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36f60 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
36f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
36f80 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
36f90 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 0a 20  ALMODE_WAL );.. 
36fa0 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 67 20 66   /* If the log f
36fb0 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ile is not alrea
36fc0 64 79 20 6f 70 65 6e 2c 20 62 75 74 20 64 6f 65  dy open, but doe
36fd0 73 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 66  s exist in the f
36fe0 69 6c 65 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a  ile-system,.  **
36ff0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
37000 62 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  be checkpointed 
37010 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6e 6e 65  before the conne
37020 63 74 69 6f 6e 20 63 61 6e 20 73 77 69 74 63 68  ction can switch
37030 20 74 6f 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   to.  ** rollbac
37040 6b 20 6d 6f 64 65 2e 20 4f 70 65 6e 20 69 74 20  k mode. Open it 
37050 6e 6f 77 20 73 6f 20 74 68 69 73 20 63 61 6e 20  now so this can 
37060 68 61 70 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  happen..  */.  i
37070 66 28 20 21 70 50 61 67 65 72 2d 3e 70 57 61 6c  f( !pPager->pWal
37080 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 67 65   ){.    int loge
37090 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 72  xists = 0;.    r
370a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
370b0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  k(pPager->fd, SQ
370c0 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
370d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
370e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
370f0 20 20 72 63 20 3d 20 70 61 67 65 72 48 61 73 57    rc = pagerHasW
37100 41 4c 28 70 50 61 67 65 72 2c 20 26 6c 6f 67 65  AL(pPager, &loge
37110 78 69 73 74 73 29 3b 0a 20 20 20 20 7d 0a 20 20  xists);.    }.  
37120 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37130 5f 4f 4b 20 26 26 20 6c 6f 67 65 78 69 73 74 73  _OK && logexists
37140 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
37150 71 6c 69 74 65 33 57 61 6c 4f 70 65 6e 28 70 50  qlite3WalOpen(pP
37160 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
37170 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  er->zFilename, &
37180 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
37190 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a 20 20     }.  }.    .  
371a0 2f 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 61 6e  /* Checkpoint an
371b0 64 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f 67 2e  d close the log.
371c0 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c   Because an EXCL
371d0 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65  USIVE lock is he
371e0 6c 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 64  ld on.  ** the d
371f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
37200 65 20 6c 6f 67 20 61 6e 64 20 6c 6f 67 2d 73 75  e log and log-su
37210 6d 6d 61 72 79 20 66 69 6c 65 73 20 77 69 6c 6c  mmary files will
37220 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 2a   be deleted..  *
37230 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
37240 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
37250 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  >pWal ){.    rc 
37260 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
37270 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
37280 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
37290 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  E);.    if( rc==
372a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
372b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
372c0 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  alClose(pPager->
372d0 70 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 66 64  pWal, pPager->fd
372e0 2c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  ,.        (pPage
372f0 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20  r->noSync ? 0 : 
37300 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
37310 67 73 29 2c 20 0a 20 20 20 20 20 20 20 20 28 75  gs), .        (u
37320 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
37330 70 61 63 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  pace.      );.  
37340 20 20 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c      pPager->pWal
37350 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
37360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37370 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
37380 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.