/ Hex Artifact Content
Login

Artifact ad9cb3bea70d8b159de1a9b235c94c7abc340956:


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 23  p processes */.#
4b10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4b20: 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57  IT_WAL.  Wal *pW
4b30: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
4b40: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68       /* Write-ah
4b50: 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20  ead log used by 
4b60: 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61  "journal_mode=wa
4b70: 6c 22 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  l" */.#endif.};.
4b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
4b90: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
4ba0: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
4bb0: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
4bc0: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
4bd0: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
4be0: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
4bf0: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
4c00: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
4c10: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4c20: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
4c30: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
4c40: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
4c50: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
4c60: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
4c70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4c80: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
4c90: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
4ca0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4cb0: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
4cc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
4cd0: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
4ce0: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
4cf0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4d00: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
4d10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4d20: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4d30: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66  journal */.# def
4d40: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
4d50: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
4d60: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
4d70: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  (v).#endif..../*
4d80: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
4d90: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
4da0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
4db0: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
4dc0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
4dd0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
4de0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
4df0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
4e00: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
4e10: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
4e20: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
4e30: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
4e40: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
4e50: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
4e60: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
4e70: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
4e80: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
4e90: 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69   is being.** wri
4ea0: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
4eb0: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
4ec0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
4ed0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
4ee0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
4ef0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
4f00: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
4f10: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
4f20: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
4f30: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
4f40: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
4f50: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
4f60: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
4f70: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
4f80: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
4f90: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
4fa0: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
4fb0: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
4fc0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
4fd0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
4fe0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
4ff0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
5000: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
5010: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
5020: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
5030: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
5040: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
5050: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
5060: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
5070: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
5080: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
5090: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
50a0: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
50b0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
50c0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
50d0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
50e0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
50f0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
5100: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
5110: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
5120: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
5130: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
5140: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
5150: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
5160: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
5170: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
5180: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
5190: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
51a0: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
51b0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
51c0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
51d0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
51e0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
51f0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
5200: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
5210: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
5220: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
5230: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
5240: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
5250: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
5260: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
5270: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
5280: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
5290: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
52a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
52b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
52c0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
52d0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
52e0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
52f0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
5300: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 66  e size of the of
5310: 20 65 61 63 68 20 70 61 67 65 20 72 65 63 6f 72   each page recor
5320: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
5330: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
5340: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
5350: 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  cro..*/.#define 
5360: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
5370: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
5380: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
5390: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
53a0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
53b0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  or this pager. T
53c0: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 74  his is usually t
53d0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65  he same .** size
53e0: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64 69 73   as a single dis
53f0: 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20 61 6c  k sector. See al
5400: 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  so setSectorSize
5410: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ()..*/.#define J
5420: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5430: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
5440: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
5450: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
5460: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
5470: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
5480: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
5490: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
54a0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
54b0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
54c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
54d0: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
54e0: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
54f0: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
5500: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
5510: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
5520: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
5530: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
5540: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
5550: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5560: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
5570: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
5580: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
5590: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
55a0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
55b0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
55c0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
55d0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
55e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
55f0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
5600: 36 34 37 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  647..#ifndef NDE
5610: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  BUG ./*.** Usage
5620: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
5630: 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
5640: 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
5650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  */.static int as
5660: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
5670: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5680: 0a 0a 20 20 2f 2a 20 41 20 74 65 6d 70 2d 66 69  ..  /* A temp-fi
5690: 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  le is always in 
56a0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
56b0: 6f 72 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  or PAGER_SYNCED 
56c0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65  state. */.  asse
56d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
56e0: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  File==0 || pPage
56f0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
5700: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
5710: 2f 2a 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75  /* The changeCou
5720: 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61  ntDone flag is a
5730: 6c 77 61 79 73 20 73 65 74 20 66 6f 72 20 74 65  lways set for te
5740: 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73  mp-files */.  as
5750: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
5760: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
5770: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
5780: 44 6f 6e 65 20 29 3b 0a 0a 20 20 72 65 74 75 72  Done );..  retur
5790: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
57a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
57b0: 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73   if it is necess
57c0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67  ary to write pag
57d0: 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20  e *pPg into the 
57e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  sub-journal..** 
57f0: 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  A page needs to 
5800: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
5810: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
5820: 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
5830: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f  one.** or more o
5840: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66  pen savepoints f
5850: 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20  or which:.**.** 
5860: 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d    * The page-num
5870: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
5880: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67   or equal to Pag
5890: 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69  erSavepoint.nOri
58a0: 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  g, and.**   * Th
58b0: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
58c0: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ing to the page-
58d0: 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65  number is not se
58e0: 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65  t in.**     Page
58f0: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
5900: 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  vepoint..*/.stat
5910: 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69  ic int subjRequi
5920: 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70  resPage(PgHdr *p
5930: 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  Pg){.  Pgno pgno
5940: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
5950: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5960: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
5970: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5980: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
5990: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
59a0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
59b0: 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53  *p = &pPager->aS
59c0: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
59d0: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
59e0: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
59f0: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
5a00: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
5a10: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
5a20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
5a30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5a40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
5a50: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
5a60: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
5a70: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
5a80: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
5a90: 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  nJournal(PgHdr *
5aa0: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
5ab0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
5ac0: 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49  (pPg->pPager->pI
5ad0: 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
5ae0: 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  gno);.}../*.** R
5af0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
5b00: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
5b10: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
5b20: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
5b30: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
5b40: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
5b50: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
5b60: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
5b70: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
5b80: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
5b90: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5ba0: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
5bb0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
5bc0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
5bd0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
5be0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
5bf0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
5c00: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
5c10: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
5c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
5c30: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
5c40: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
5c50: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
5c60: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
5c70: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5c80: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
5c90: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
5ca0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5cb0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
5cc0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
5cd0: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
5ce0: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
5cf0: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
5d00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
5d10: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
5d20: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
5d30: 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72  *)A,B)../*.** Wr
5d40: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
5d50: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
5d60: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
5d70: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
5d80: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
5d90: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
5da0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
5db0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
5dc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5dd0: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
5de0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
5df0: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
5e00: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
5e10: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
5e20: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
5e30: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
5e40: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
5e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
5e60: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d  gument to this m
5e70: 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64  acro is a file d
5e80: 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65 20  escriptor (type 
5e90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a  sqlite3_file*)..
5ea0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 69  ** Return 0 if i
5eb0: 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  t is not open, o
5ec0: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20  r non-zero (but 
5ed0: 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73 2e  not 1) if it is.
5ee0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
5ef0: 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  o that expressio
5f00: 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ns can be writte
5f10: 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  n as:.**.**   if
5f20: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
5f30: 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a  >jfd) ){ ....**.
5f40: 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ** instead of.**
5f50: 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65 72  .**   if( pPager
5f60: 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
5f70: 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ){ ....*/.#defin
5f80: 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28  e isOpen(pFd) ((
5f90: 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  pFd)->pMethods).
5fa0: 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70  ./*.** If file p
5fb0: 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c  Fd is open, call
5fc0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
5fd0: 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61  () on it..*/.sta
5fe0: 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b  tic int osUnlock
5ff0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
6000: 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  Fd, int eLock){.
6010: 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 46    if( !isOpen(pF
6020: 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
6030: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
6040: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6050: 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c  OsUnlock(pFd, eL
6060: 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ock);.}../*.** T
6070: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
6080: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
6090: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
60a0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
60b0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
60c0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
60d0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
60e0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
60f0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
6100: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
6110: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
6120: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
6130: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
6140: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
6150: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
6160: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
6170: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
6180: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
6190: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
61a0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
61b0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
61c0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
61d0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
61e0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
61f0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
6200: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
6210: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
6220: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
6230: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
6240: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
6250: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
6260: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
6270: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
6280: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
6290: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
62a0: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
62b0: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
62c0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
62d0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
62e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
62f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
6300: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
6310: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
6320: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
6330: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6340: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
6350: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
6360: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
6370: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
6380: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
6390: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
63a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
63b0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
63e0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
63f0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
6420: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
6430: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6450: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
6460: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
6470: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
6480: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
6490: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
64a0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
64b0: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
64c0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
64d0: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
64e0: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
64f0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
6500: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
6510: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
6520: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
6530: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
6540: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
6550: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
6560: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
6570: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
6580: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
6590: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
65a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
65b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
65c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
65d0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
65e0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
65f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6600: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
6610: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
6620: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
6630: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
6640: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
6650: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
6660: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
6670: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
6680: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
6690: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
66a0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
66b0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
66c0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
66d0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
66e0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
66f0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
6700: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
6710: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
6720: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
6730: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
6740: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
6750: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
6760: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
6770: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
6780: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
6790: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
67a0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
67b0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
67c0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
67d0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
67e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
67f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
6800: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
6810: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
6820: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
6830: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
6840: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
6850: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
6860: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
6870: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
6880: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
6890: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
68a0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
68b0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
68c0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
68d0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
68e0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
68f0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
6900: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
6910: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
6920: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
6930: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
6940: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
6950: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
6960: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
6970: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
6980: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
6990: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
69a0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
69b0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
69c0: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
69d0: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
69e0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20  rrCode.      || 
69f0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
6a00: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
6a10: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
6a20: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
6a30: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
6a40: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
6a50: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
6a60: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
6a70: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
6a80: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
6a90: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
6aa0: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
6ab0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
6ac0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
6ad0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
6ae0: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
6af0: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73  be open..** This
6b00: 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
6b10: 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73  ts to read a mas
6b20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
6b30: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a   name from the .
6b40: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
6b50: 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65  le and, if succe
6b60: 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74  ssful, copies it
6b70: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
6b80: 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65  plied .** by the
6b90: 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d   caller. See com
6ba0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74  ments above writ
6bb0: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
6bc0: 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a   for the format.
6bd0: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
6be0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
6bf0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74  l file name at t
6c00: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
6c10: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
6c20: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
6c30: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
6c40: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
6c50: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
6c60: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
6c70: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
6c80: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
6c90: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
6ca0: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
6cb0: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
6cc0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
6cd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6ce0: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
6cf0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
6d00: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
6d10: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
6d20: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
6d30: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
6d40: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
6d50: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
6d60: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
6d70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6d80: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
6d90: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
6da0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74  .**.** If a mast
6db0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6dc0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
6dd0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
6de0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6df0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  e, then it is co
6e00: 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75  pied into the bu
6e10: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
6e20: 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a  by zMaster. A.**
6e30: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
6e40: 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64  byte is appended
6e50: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66   to the buffer f
6e60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73  ollowing the mas
6e70: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
6e80: 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile name..**.** 
6e90: 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69  If it is determi
6ea0: 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74  ned that no mast
6eb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
6ec0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
6ed0: 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  .** zMaster[0] i
6ee0: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
6ef0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
6f00: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
6f10: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
6f20: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
6f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
6f40: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
6f50: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6f60: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6f70: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
6f80: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
6f90: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
6fa0: 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d  *zMaster, u32 nM
6fb0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
6fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6fd0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6fe0: 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  ode */.  u32 len
6ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7000: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e      /* Length in
7010: 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72   bytes of master
7020: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
7030: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7050: 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62   Total size in b
7060: 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ytes of journal 
7070: 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20  file pJrnl */.  
7080: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a             /* MJ
70a0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
70b0: 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  read from journa
70c0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70e0: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
70f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
7100: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
7110: 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20  agic[8];   /* A 
7120: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
7130: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
7140: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  */.  zMaster[0] 
7150: 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53  = '\0';..  if( S
7160: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
7170: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
7180: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a  e(pJrnl, &szJ)).
7190: 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20     || szJ<16.   
71a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
71b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
71c0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
71d0: 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d  en)).   || len>=
71e0: 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 53  nMaster .   || S
71f0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
7200: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
7210: 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d  , szJ-12, &cksum
7220: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
7230: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
7240: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
7250: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
7260: 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  ).   || memcmp(a
7270: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
7280: 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53  agic, 8).   || S
7290: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
72a0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
72b0: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
72c0: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a  n, szJ-16-len)).
72d0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
72e0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
72f0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
7300: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
7310: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7320: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
7330: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
7340: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
7350: 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  r[u];.  }.  if( 
7360: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
7370: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
7380: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
7390: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
73a0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
73b0: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
73c0: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
73d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
73e0: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
73f0: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
7400: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
7410: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
7420: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7430: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
7440: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
7450: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
7460: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
7470: 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  len = 0;.  }.  z
7480: 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c  Master[len] = '\
7490: 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e  0';.   .  return
74a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
74b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
74c0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65  offset of the se
74d0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74  ctor boundary at
74e0: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   or immediately 
74f0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
7500: 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65  e value in pPage
7510: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61  r->journalOff, a
7520: 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72  ssuming a sector
7530: 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61   .** size of pPa
7540: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
7550: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  bytes..**.** i.e
7560: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
7570: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
7580: 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c     Pager.journal
7590: 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74  Off          Ret
75a0: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d  urn value.**   -
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32        0.**   512
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
7620: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
7630: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
7640: 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20     2000         
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
7660: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
7670: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  i64 journalHdrOf
7680: 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  fset(Pager *pPag
7690: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
76a0: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
76b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
76c0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
76d0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
76e0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
76f0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
7700: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
7710: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7720: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
7730: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
7740: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
7750: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
7760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
7770: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
7780: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
7790: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65  ;.  return offse
77a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
77b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
77c0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
77d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
77e0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
77f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
7800: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f   no-op if the jo
7810: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e  urnal file has n
7820: 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ot been written 
7830: 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  to.** within the
7840: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
7850: 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61  tion (i.e. if Pa
7860: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  ger.journalOff==
7870: 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54  0)..**.** If doT
7880: 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a  runcate is non-z
7890: 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72  ero or the Pager
78a0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
78b0: 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a  t variable is.**
78c0: 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20   set to 0, then 
78d0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
78e0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72  rnal file to zer
78f0: 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
7900: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a   Otherwise,.** z
7910: 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20  ero the 28-byte 
7920: 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74  header at the st
7930: 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
7940: 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68  al file. In eith
7950: 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20  er case, .** if 
7960: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
7970: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
7980: 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
7990: 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74  al file immediat
79a0: 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72  ely .** after wr
79b0: 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  iting or truncat
79c0: 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ing it..**.** If
79d0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
79e0: 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74  zeLimit is set t
79f0: 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f  o a positive, no
7a00: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e  n-zero value, an
7a10: 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  d.** following t
7a20: 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72  he truncation or
7a30: 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62   zeroing describ
7a40: 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a  ed above the siz
7a50: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75  e of the .** jou
7a60: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
7a70: 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  es is larger tha
7a80: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68  n this value, th
7a90: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  en truncate the.
7aa0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
7ab0: 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  to Pager.journal
7ac0: 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e  SizeLimit bytes.
7ad0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
7ae0: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65  e does.** not ne
7af0: 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20  ed to be synced 
7b00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
7b10: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
7b20: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
7b30: 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70  ccurs, abandon p
7b40: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
7b50: 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  turn the IO erro
7b60: 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72  r code..** Other
7b70: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  wise, return SQL
7b80: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7b90: 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61  c int zeroJourna
7ba0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
7bb0: 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61  er, int doTrunca
7bc0: 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  te){.  int rc = 
7bd0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7c00: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
7c10: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7c20: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66  er->jfd) );.  if
7c30: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7c40: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73  lOff ){.    cons
7c50: 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70  t i64 iLimit = p
7c60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
7c70: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c  zeLimit;    /* L
7c80: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73  ocal cache of js
7c90: 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43  l */..    IOTRAC
7ca0: 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c  E(("JZEROHDR %p\
7cb0: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
7cc0: 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20   if( doTruncate 
7cd0: 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  || iLimit==0 ){.
7ce0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7cf0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
7d00: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
7d10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
7d20: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7d30: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b   zeroHdr[28] = {
7d40: 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0};.      rc = s
7d50: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
7d60: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
7d70: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
7d80: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
7d90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7da0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
7db0: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
7dc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
7dd0: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
7de0: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
7df0: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
7e00: 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
7e10: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
7e20: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
7e30: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
7e40: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
7e50: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
7e60: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
7e70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
7e80: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
7e90: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
7ea0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
7eb0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
7ec0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
7ed0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
7ee0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
7ef0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
7f00: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
7f10: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
7f20: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
7f30: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
7f40: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
7f50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
7f60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
7f70: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
7f80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
7f90: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
7fa0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
7fb0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
7fc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
7fd0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
7fe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7ff0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
8000: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8010: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
8020: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
8030: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
8060: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
8070: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
8080: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8090: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
80a0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
80b0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
80c0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
80d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
80e0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
80f0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
8100: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
8110: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
8120: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
8130: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
8140: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
8150: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
8160: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
8170: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
8180: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
8190: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
81a0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
81b0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
81c0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
81d0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
81e0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
81f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
8200: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
8210: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
8220: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
8230: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
8240: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
8250: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
8260: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
8270: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
8280: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8290: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
82a0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
82b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
82c0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
82d0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
82e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
82f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8300: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8310: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
8320: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
8330: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
8340: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
8350: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
8360: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
8370: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  er = pPager->pag
8380: 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69  eSize;     /* Si
8390: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
83a0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
83b0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
83c0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
83e0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
83f0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
8400: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8430: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
8440: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
8450: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
8460: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
8470: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
8480: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
8490: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
84a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
84b0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
84c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
84d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
84e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
84f0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
8500: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
8510: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
8520: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
8530: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
8540: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
8550: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
8560: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
8570: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
8580: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
8590: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
85a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
85b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
85c0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
85d0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
85e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
85f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
8600: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
8610: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8620: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
8630: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
8640: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
8650: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
8660: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
8670: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
8680: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
8690: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
86a0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
86b0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
86c0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
86d0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
86e0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
86f0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
8700: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
8710: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
8720: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
8730: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
8740: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
8750: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
8760: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
8770: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
8780: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
8790: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
87a0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
87b0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
87c0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
87d0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
87e0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
87f0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
8800: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
8810: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
8820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
8830: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
8840: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
8850: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
8860: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
8870: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
8880: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
8890: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
88a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
88b0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
88c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
88d0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
88e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
88f0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
8900: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
8910: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
8920: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
8930: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
8940: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
8950: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
8960: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
8970: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
8980: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
8990: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
89a0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
89b0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
89c0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
89d0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
89e0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
89f0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
8a00: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
8a10: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
8a20: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
8a30: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
8a40: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
8a50: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
8a60: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
8a70: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
8a80: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
8a90: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
8aa0: 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61 67  noSync) || (pPag
8ab0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
8ac0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
8ad0: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
8ae0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
8af0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
8b00: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
8b10: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
8b20: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
8b30: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
8b40: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
8b50: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8b60: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
8b70: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
8b80: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8b90: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
8ba0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
8bb0: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
8bc0: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
8bd0: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
8be0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
8bf0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
8c00: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
8c10: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
8c20: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
8c30: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
8c40: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8c50: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
8c60: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8c70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
8c80: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
8c90: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
8ca0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
8cb0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
8cc0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8cd0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8ce0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
8cf0: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
8d00: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
8d10: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
8d20: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
8d30: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8d40: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8d50: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
8d60: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
8d70: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
8d80: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
8d90: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
8da0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
8db0: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
8dc0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
8dd0: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
8de0: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
8df0: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
8e00: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
8e10: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
8e20: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
8e30: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
8e40: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
8e50: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
8e60: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
8e70: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
8e80: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
8e90: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
8ea0: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
8eb0: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
8ec0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
8ed0: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
8ee0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8ef0: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
8f00: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
8f10: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8f20: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
8f30: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
8f40: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
8f50: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
8f60: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
8f70: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
8f80: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
8f90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
8fa0: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
8fb0: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
8fc0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
8fd0: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
8fe0: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
8ff0: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
9000: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
9010: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
9020: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
9030: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
9040: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
9050: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
9060: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
9070: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
9080: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
9090: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
90a0: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
90b0: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
90c0: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
90d0: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
90e0: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
90f0: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
9100: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
9110: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
9120: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
9130: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
9140: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
9150: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
9160: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
9170: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
9180: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
9190: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
91a0: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
91b0: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
91c0: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
91d0: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
91e0: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
91f0: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
9200: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
9210: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
9220: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
9230: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
9240: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
9250: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
9260: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
9270: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
9280: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
9290: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
92a0: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
92b0: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
92c0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
92d0: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
92e0: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
92f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9300: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
9310: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
9320: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
9330: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
9340: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
9350: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
9360: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9370: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
9380: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
9390: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
93a0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
93b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
93c0: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
93d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
93e0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
93f0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
9400: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
9410: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9420: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
9430: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
9440: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
9450: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
9460: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
9470: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
9480: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
9490: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
94a0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
94b0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
94c0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
94d0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
94e0: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
94f0: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
9500: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
9510: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
9520: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
9530: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
9540: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
9550: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
9560: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
9570: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
9580: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
9590: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
95a0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
95b0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
95c0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
95d0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
95e0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
95f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
9600: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
9610: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
9620: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
9630: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
9640: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
9650: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
9660: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
9670: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
9680: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
9690: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
96a0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
96b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
96c0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
96d0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
96e0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
96f0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
9700: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
9710: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
9720: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
9730: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
9740: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
9750: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9760: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
9770: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
9780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
9790: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
97a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97c0: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
97d0: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
97e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9800: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
9810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
9820: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
9830: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
9840: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9850: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
9860: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
9870: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
98a0: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
98b0: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
98c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
98f0: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
9900: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
9910: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
9920: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
9930: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
9940: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
9950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9960: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
9970: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
9980: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
9990: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
99a0: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
99b0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
99c0: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
99d0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
99e0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
99f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
9a00: 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
9a10: 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
9a20: 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
9a30: 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
9a40: 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
9a50: 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
9a60: 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
9a70: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
9a80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
9a90: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
9aa0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
9ab0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9ac0: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
9ad0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9ae0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
9af0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9b00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
9b10: 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
9b20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
9b30: 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
9b40: 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
9b50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
9b60: 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
9b70: 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
9b80: 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
9b90: 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
9ba0: 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
9bb0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
9bc0: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
9bd0: 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
9be0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9bf0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
9c00: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
9c10: 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
9c20: 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
9c30: 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
9c40: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
9c50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9c60: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
9c70: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
9c80: 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
9c90: 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
9ca0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9cb0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
9cc0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
9cd0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
9ce0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
9cf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
9d00: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9d10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9d20: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
9d30: 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
9d40: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
9d50: 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
9d60: 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
9d70: 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
9d80: 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
9d90: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
9da0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
9db0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
9dc0: 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
9dd0: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
9de0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
9df0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
9e00: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
9e10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
9e20: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
9e30: 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
9e40: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
9e50: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
9e60: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
9e70: 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
9e80: 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
9e90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
9ea0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
9eb0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
9ec0: 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
9ed0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
9ee0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
9ef0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
9f00: 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
9f10: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
9f20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
9f30: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
9f40: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
9f50: 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
9f60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
9f70: 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
9f80: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
9f90: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  eader */.    u16
9fa0: 20 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20   iPageSize16;   
9fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
9fc0: 79 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69  y of iPageSize i
9fd0: 6e 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c  n 16-bit variabl
9fe0: 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  e */..    /* Rea
9ff0: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
a000: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
a010: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
a020: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
a030: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
a040: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a050: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a060: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
a070: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
a080: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
a090: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a0a0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
a0b0: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
a0c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
a0d0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
a0e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
a0f0: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
a100: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
a110: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
a120: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
a130: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
a140: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
a150: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
a160: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
a170: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
a180: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
a190: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
a1a0: 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
a1b0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
a1c0: 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
a1d0: 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
a1e0: 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
a1f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a200: 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
a230: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
a240: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
a250: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
a260: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
a270: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
a280: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
a290: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
a2a0: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
a2b0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
a2c0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
a2d0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
a2e0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
a2f0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
a300: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
a310: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
a320: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
a330: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
a340: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
a350: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
a360: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
a370: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
a380: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
a390: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
a3a0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
a3b0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
a3c0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
a3d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
a3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a3f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a400: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
a410: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
a420: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
a430: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
a440: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
a450: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
a460: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
a470: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
a480: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
a490: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
a4a0: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
a4b0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
a4c0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
a4d0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
a4e0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
a4f0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
a500: 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b  PageSize16, -1);
a510: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
a520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
a530: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
a540: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61  SQLITE_OK || iPa
a550: 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69  geSize16==(u16)i
a560: 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  PageSize );..   
a570: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
a580: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
a590: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
a5a0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
a5b0: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
a5c0: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
a5d0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
a5e0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
a5f0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
a600: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a610: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a620: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a630: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
a640: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
a650: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
a660: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
a670: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
a680: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
a690: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
a6a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
a6b0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
a6c0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
a6d0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
a6e0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
a6f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a700: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
a710: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
a720: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
a730: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
a740: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
a750: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
a760: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a770: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
a780: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
a790: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
a7a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a7b0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
a7c0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
a7d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
a7e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
a7f0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
a800: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
a810: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
a820: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
a830: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
a840: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
a850: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
a860: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
a870: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
a880: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
a890: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
a8a0: 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
a8b0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
a8c0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
a8d0: 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
a8e0: 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
a8f0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
a900: 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
a910: 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
a920: 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
a930: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
a940: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
a950: 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
a960: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
a970: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
a980: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
a990: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
a9a0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
a9b0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
a9c0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
a9d0: 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
a9e0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
a9f0: 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
aa00: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
aa10: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
aa20: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
aa30: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
aa40: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
aa50: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
aa60: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
aa70: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
aa80: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
aa90: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
aaa0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
aab0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
aac0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
aaf0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
ab20: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
ab30: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
ab40: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
ab50: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
ab60: 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
ab70: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
ab80: 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aba0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
abb0: 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
abc0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
abd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
abe0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
abf0: 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
ac00: 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ster */..  if( !
ac10: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
ac20: 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20  r->setMaster.   
ac30: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ac40: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac50: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
ac60: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
ac70: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ac80: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
ac90: 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
aca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
acb0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
acc0: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
acd0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
ace0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
acf0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ad00: 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
ad10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ad20: 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
ad30: 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
ad40: 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
ad50: 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
ad60: 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
ad70: 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
ad80: 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
ad90: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
ada0: 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
adb0: 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
adc0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
add0: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
ade0: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
adf0: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
ae00: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
ae10: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
ae20: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
ae30: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
ae40: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
ae50: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
ae60: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
ae70: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
ae80: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
ae90: 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
aea0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
aeb0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
aec0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
aed0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
aee0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
aef0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
af00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
af10: 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
af20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
af30: 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
af40: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
af50: 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
af60: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
af70: 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
af80: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
af90: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
afa0: 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
afb0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
afc0: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
afd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
afe0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
aff0: 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
b000: 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
b010: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
b020: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
b030: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
b040: 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
b050: 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
b060: 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
b070: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
b080: 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
b090: 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
b0a0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
b0b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
b0c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
b0d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
b0e0: 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
b0f0: 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20  er+8))).  ){.   
b100: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
b110: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b120: 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72  lOff += (nMaster
b130: 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  +20);.  pPager->
b140: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
b150: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f  er->noSync;..  /
b160: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
b170: 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
b180: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
b190: 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
b1a0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
b1b0: 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
b1c0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b1d0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b1e0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
b1f0: 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
b200: 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
b210: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
b220: 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
b230: 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
b240: 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
b250: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
b260: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
b270: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
b280: 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
b290: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
b2a0: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
b2b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b2c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
b2d0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
b2e0: 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
b2f0: 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
b300: 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
b310: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
b320: 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
b330: 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
b340: 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45  */ .  if( SQLITE
b350: 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK==(rc = sqlit
b360: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
b370: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
b380: 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c  ize)).   && jrnl
b390: 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75  Size>pPager->jou
b3a0: 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  rnalOff.  ){.   
b3b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
b3c0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
b3d0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
b3e0: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  rnalOff);.  }.  
b3f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b400: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
b410: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
b420: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
b430: 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a   number. Return.
b440: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
b450: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
b460: 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
b470: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a  d page is not .*
b480: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d  * already in mem
b490: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ory..*/.static P
b4a0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
b4b0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
b4c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
b4d0: 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
b500: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73  e */..  /* It is
b510: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
b520: 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63  r a call to Pcac
b530: 68 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63  heFetch() with c
b540: 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a  reateFlag==0 to.
b550: 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65    ** fail, since
b560: 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   no attempt to a
b570: 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20  llocate dynamic 
b580: 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d  memory will be m
b590: 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  ade..  */.  (voi
b5a0: 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
b5b0: 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
b5c0: 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
b5d0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  p);.  return p;.
b5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  }../*.** Unless 
b5f0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b600: 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73  error-state, dis
b610: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
b620: 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20  ry pages. If.** 
b630: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b640: 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65  error-state, the
b650: 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  n this call is a
b660: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f   no-op..**.** TO
b670: 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e  DO: Why can we n
b680: 6f 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67  ot reset the pag
b690: 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f  er while in erro
b6a0: 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74  r state?.*/.stat
b6b0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
b6c0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
b6d0: 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  r){.  if( SQLITE
b6e0: 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72  _OK==pPager->err
b6f0: 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Code ){.    sqli
b700: 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
b710: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
b720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
b730: 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
b740: 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
b750: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
b760: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  lid = 0;.  }.}..
b770: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73  /*.** Free all s
b780: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
b790: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
b7a0: 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65  t[] array and se
b7b0: 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e  t both.** Pager.
b7c0: 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50  aSavepoint and P
b7d0: 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20  ager.nSavepoint 
b7e0: 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74  to zero. Close t
b7f0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
b800: 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20  * if it is open 
b810: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
b820: 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
b830: 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  e mode..*/.stati
b840: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c  c void releaseAl
b850: 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65  lSavepoints(Page
b860: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
b870: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
b880: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
b890: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  for looping thro
b8a0: 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70  ugh Pager.aSavep
b8b0: 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69  oint */.  for(ii
b8c0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
b8d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
b8e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
b8f0: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
b900: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
b910: 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
b920: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
b930: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
b940: 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65  e || sqlite3IsMe
b950: 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
b960: 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71  >sjfd) ){.    sq
b970: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
b980: 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a  ger->sjfd);.  }.
b990: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b9a0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
b9b0: 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53  t);.  pPager->aS
b9c0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
b9d0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b9e0: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
b9f0: 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d  ->nSubRec = 0;.}
ba00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
ba10: 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  bit number pgno 
ba20: 69 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65  in the PagerSave
ba30: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
ba40: 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f  nt .** bitvecs o
ba50: 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  f all open savep
ba60: 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51  oints. Return SQ
ba70: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
ba80: 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49  ssful.** or SQLI
ba90: 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
baa0: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
bab0: 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  urs..*/.static i
bac0: 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
bad0: 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
bae0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
baf0: 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
bb20: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
bb30: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
bb40: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
bb50: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
bb60: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
bb70: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
bb80: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
bb90: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
bba0: 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
bbb0: 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
bbc0: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
bbd0: 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
bbe0: 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
bbf0: 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
bc00: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
bc10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
bc20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
bc30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
bc40: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
bc50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
bc60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
bc70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
bc80: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
bc90: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
bca0: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
bcb0: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
bcc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
bcd0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
bce0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
bcf0: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
bd00: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
bd10: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bd20: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
bd30: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
bd40: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
bd50: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
bd60: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
bd70: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
bd80: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
bd90: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
bda0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
bdb0: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
bdc0: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
bdd0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65   define pagerOpe
bde0: 6e 53 6e 61 70 73 68 6f 74 28 7a 29 20 53 51 4c  nSnapshot(z) SQL
bdf0: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
be00: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
be10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
be20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
be30: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
be40: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
be50: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
be60: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
be70: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
be80: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
be90: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
bea0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
beb0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
bec0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
bed0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
bee0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
bef0: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
bf00: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
bf10: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
bf20: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
bf30: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
bf40: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
bf50: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
bf60: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
bf70: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
bf80: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
bf90: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
bfa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bfb0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
bfc0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
bfd0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
bfe0: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
bff0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c000: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
c010: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
c020: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
c030: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
c040: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
c050: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
c060: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
c070: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
c080: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
c090: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
c0a0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
c0b0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
c0c0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
c0d0: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
c0e0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c0f0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c100: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
c110: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
c120: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
c130: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c140: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  l = 0;.    relea
c150: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
c160: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
c170: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
c180: 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f  unlocked, somebo
c190: 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68  dy else might ch
c1a0: 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20  ange it. The.   
c1b0: 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65   ** values store
c1c0: 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  d in Pager.dbSiz
c1d0: 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63  e etc. might bec
c1e0: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20  ome invalid if. 
c1f0: 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65     ** this happe
c200: 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20 61 72 67  ns.  One can arg
c210: 75 65 20 74 68 61 74 20 74 68 69 73 20 64 6f 65  ue that this doe
c220: 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65 20  sn't need to be 
c230: 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a 20 75  cleared.    ** u
c240: 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67 65 2d  ntil the change-
c250: 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20 66 61  counter check fa
c260: 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68 61 72  ils in PagerShar
c270: 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2a  edLock()..    **
c280: 20 43 6c 65 61 72 69 6e 67 20 74 68 65 20 70 61   Clearing the pa
c290: 67 65 20 73 69 7a 65 20 63 61 63 68 65 20 68 65  ge size cache he
c2a0: 72 65 20 69 73 20 62 65 69 6e 67 20 63 6f 6e 73  re is being cons
c2b0: 65 72 76 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  ervative..    */
c2c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
c2d0: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20  izeValid = 0;.. 
c2e0: 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
c2f0: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
c300: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c      sqlite3WalCl
c310: 6f 73 65 53 6e 61 70 73 68 6f 74 28 70 50 61 67  oseSnapshot(pPag
c320: 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d  er->pWal);.    }
c330: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
c340: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
c350: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
c360: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
c370: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
c380: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
c390: 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
c3a0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
c3b0: 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
c3c0: 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43  /* If Pager.errC
c3d0: 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20  ode is set, the 
c3e0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
c3f0: 70 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e  pager cache cann
c400: 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75  ot be.    ** tru
c410: 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
c420: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
c430: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63   unlocked, the c
c440: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
c450: 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20     ** cache can 
c460: 62 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64  be discarded and
c470: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
c480: 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a  safely cleared..
c490: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c4a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
c4b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
c4c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c4d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c4e0: 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
c4f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c500: 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
c510: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
c520: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
c530: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
c540: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
c550: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
c560: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
c570: 69 66 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ified = 0;.  }.}
c580: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c590: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
c5a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49  called when an I
c5b0: 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72  OERR, CORRUPT or
c5c0: 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d   FULL error.** m
c5d0: 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
c5e0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
c5f0: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
c600: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a  r to the pager .
c610: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
c620: 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  e second the err
c630: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
c640: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
c650: 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20  a pager .** API 
c660: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
c670: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
c680: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
c690: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a  cond argument .*
c6a0: 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
c6b0: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
c6c0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
c6d0: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
c6e0: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
c6f0: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
c700: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
c710: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
c720: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
c730: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
c740: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
c750: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
c760: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
c770: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
c780: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
c790: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
c7a0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
c7b0: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
c7c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
c7d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
c7e0: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
c7f0: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
c800: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
c810: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
c820: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
c830: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
c840: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
c850: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
c860: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
c870: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
c880: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
c890: 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74  occurred, then t
c8a0: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
c8b0: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
c8c0: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74  to be replayed t
c8d0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f  o restore the co
c8e0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
c8f0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
c900: 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20  if.** it were a 
c910: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f  hot-journal)..*/
c920: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c930: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
c940: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
c950: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
c960: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
c970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
c980: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
c990: 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
c9a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
c9b0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
c9c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
c9d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
c9e0: 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
c9f0: 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
ca00: 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
ca10: 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d    );.  if( rc2==
ca20: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72  SQLITE_FULL || r
ca30: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
ca40: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ca50: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
ca60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ca70: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
ca80: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
ca90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
caa0: 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
cab0: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
cac0: 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
cad0: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
cae0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
caf0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
cb00: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
cb10: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
cb20: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
cb30: 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
cb40: 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
cb50: 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
cb60: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
cb70: 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
cb80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
cb90: 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
cba0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
cbb0: 64 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  d clear the erro
cbc0: 72 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  r state. If this
cbd0: 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74   means that.** t
cbe0: 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
cbf0: 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
cc00: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
cc10: 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69  he next connecti
cc20: 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20  on.** to obtain 
cc30: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
cc40: 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63   the pager (whic
cc50: 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e  h may be this on
cc60: 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20  e) will.** roll 
cc70: 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
cc80: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
cc90: 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65  not already ente
cca0: 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
ccb0: 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f  ate, but an IO o
ccc0: 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  r.** malloc erro
ccd0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
cce0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  a rollback, then
ccf0: 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c   this will itsel
cd00: 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  f cause .** the 
cd10: 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
cd20: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
cd30: 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c  Which will be cl
cd40: 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  eared by the.** 
cd50: 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
cd60: 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72  lock(), as descr
cd70: 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73  ibed above..*/.s
cd80: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cd90: 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
cda0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
cdb0: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
cdc0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
cdd0: 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  OK && pPager->st
cde0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
cdf0: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
ce00: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
ce10: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
ce20: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
ce30: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
ce40: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
ce50: 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67  loc();.  }.  pag
ce60: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
ce70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ce80: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
ce90: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
cea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
ceb0: 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
cec0: 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
ced0: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
cee0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
cef0: 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
cf00: 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
cf10: 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
cf20: 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
cf30: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
cf40: 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
cf50: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
cf60: 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
cf70: 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
cf80: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
cf90: 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
cfa0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
cfb0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
cfc0: 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45  s in PAGER_SHARE
cfd0: 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43  D or PAGER_UNLOC
cfe0: 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
cff0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
d000: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
d010: 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53  no-op (returns S
d020: 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a  QLITE_OK)..**.**
d030: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20   Otherwise, any 
d040: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
d050: 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a  s are released..
d060: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
d070: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
d080: 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66  n, then it is "f
d090: 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20  inalized". Once 
d0a0: 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69  a journal .** fi
d0b0: 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  le has been fina
d0c0: 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20  lized it is not 
d0d0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
d0e0: 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  it to roll back 
d0f0: 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  a .** transactio
d100: 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62  n. Nor will it b
d110: 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
d120: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
d130: 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61   by this.** or a
d140: 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ny other databas
d150: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78  e connection. Ex
d160: 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72  actly how a jour
d170: 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
d180: 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  .** depends on w
d190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
d1a0: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
d1b0: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
d1c0: 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  mode and.** the 
d1d0: 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d  current journal-
d1e0: 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72  mode (Pager.jour
d1f0: 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20  nalMode value), 
d200: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
d210: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
d220: 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a  =MEMORY.**     J
d230: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
d240: 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79  riptor is simply
d250: 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65   closed. This de
d260: 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20  stroys an .**   
d270: 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72    in-memory jour
d280: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  nal..**.**   jou
d290: 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41  rnalMode==TRUNCA
d2a0: 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  TE.**     Journa
d2b0: 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  l file is trunca
d2c0: 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ted to zero byte
d2d0: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
d2e0: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
d2f0: 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54  PERSIST.**     T
d300: 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65  he first 28 byte
d310: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
d320: 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64   file are zeroed
d330: 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74  . This invalidat
d340: 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69  es.**     the fi
d350: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
d360: 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20  er in the file, 
d370: 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e  and hence the en
d380: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  tire journal.** 
d390: 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76      file. An inv
d3a0: 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  alid journal fil
d3b0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  e cannot be roll
d3c0: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
d3d0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45   journalMode==DE
d3e0: 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20  LETE.**     The 
d3f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
d400: 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
d410: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
d420: 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
d430: 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67  *     If the pag
d440: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
d450: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
d460: 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20   this method of 
d470: 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20  finalizing.**   
d480: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
d490: 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  le is never used
d4a0: 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68  . Instead, if th
d4b0: 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73  e journalMode is
d4c0: 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61  .**     DELETE a
d4d0: 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
d4e0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
d4f0: 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65  e, the method de
d500: 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a  scribed under.**
d510: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65       journalMode
d520: 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65  ==PERSIST is use
d530: 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
d540: 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
d550: 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c  al is finalized,
d560: 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   if running in n
d570: 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  on-exclusive mod
d580: 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20  e, the.** pager 
d590: 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53  moves to PAGER_S
d5a0: 48 41 52 45 44 20 73 74 61 74 65 20 28 61 6e 64  HARED state (and
d5b0: 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20   downgrades the 
d5c0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  lock on the.** d
d5d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63 63  atabase file acc
d5e0: 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ordingly)..**.**
d5f0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d600: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
d610: 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
d620: 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45  s in PAGER_SYNCE
d630: 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d  D state,.** it m
d640: 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58  oves to PAGER_EX
d650: 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b  CLUSIVE. No lock
d660: 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64  s are downgraded
d670: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   when running in
d680: 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  .** exclusive mo
d690: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  de..**.** SQLITE
d6a0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
d6b0: 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
d6c0: 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
d6d0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a  occurs during.**
d6e0: 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f   any of the IO o
d6f0: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e  perations to fin
d700: 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
d710: 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b  l file or unlock
d720: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
d730: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
d740: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
d750: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e  ned to the user.
d760: 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72   If the .** oper
d770: 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a  ation to finaliz
d780: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d790: 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74  le fails, then t
d7a0: 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a  he code still.**
d7b0: 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b   tries to unlock
d7c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d7d0: 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63  le if not in exc
d7e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20  lusive mode. If 
d7f0: 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70  the.** unlock op
d800: 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73  eration fails as
d810: 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   well, then the 
d820: 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65  first error code
d830: 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74   related.** to t
d840: 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65  he first error e
d850: 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20  ncountered (the 
d860: 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
d870: 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20  tion one) is.** 
d880: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
d890: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
d8a0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
d8b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d8c0: 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69   hasMaster){.  i
d8d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d8e0: 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  K;      /* Error
d8f0: 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e   code from journ
d900: 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
d910: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
d920: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
d930: 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  OK;     /* Error
d940: 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69   code from db fi
d950: 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  le unlock operat
d960: 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ion */..  if( pP
d970: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
d980: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
d990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d9a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  OK;.  }.  releas
d9b0: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
d9c0: 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72  Pager);..  asser
d9d0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
d9e0: 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
d9f0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
da00: 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
da10: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
da20: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
da30: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
da40: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   );..    /* Fina
da50: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
da60: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
da70: 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  ( sqlite3IsMemJo
da80: 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
da90: 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
daa0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
dab0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
dac0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
dad0: 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y );.      sqlit
dae0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
daf0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
db00: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
db10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
db20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
db30: 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
db40: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
db50: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
db60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
db70: 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
db80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
db90: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
dba0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
dbb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
dbc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
dbd0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
dbe0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
dbf0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
dc00: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
dc10: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
dc20: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
dc30: 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
dc40: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
dc50: 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
dc60: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
dc70: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
dc80: 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
dc90: 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
dca0: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
dcb0: 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  sMaster);.      
dcc0: 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
dcd0: 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
dce0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
dcf0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
dd00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
dd10: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
dd20: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
dd30: 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
dd40: 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
dd50: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
dd60: 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
dd70: 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
dd80: 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
dd90: 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
dda0: 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
ddb0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
ddc0: 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
ddd0: 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
dde0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
ddf0: 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
de00: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
de10: 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
de20: 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
de30: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
de40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
de50: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
de60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
de70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
de80: 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20 20  ELETE .         
de90: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
dea0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
deb0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
dec0: 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  RY .           |
ded0: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
dee0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
def0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
df00: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
df10: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
df20: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
df30: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
df40: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
df50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
df60: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
df70: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
df80: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
df90: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
dfa0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
dfb0: 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ES.    sqlite3Pc
dfc0: 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
dfd0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
dfe0: 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
dff0: 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20  hash);.#endif.  
e000: 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  }.  sqlite3Bitve
e010: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
e020: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
e030: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
e040: 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  al = 0;.  pPager
e050: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71  ->nRec = 0;.  sq
e060: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
e070: 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
e080: 63 68 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  che);..  if( pag
e090: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
e0a0: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   ){.    rc2 = sq
e0b0: 6c 69 74 65 33 57 61 6c 57 72 69 74 65 4c 6f 63  lite3WalWriteLoc
e0c0: 6b 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  k(pPager->pWal, 
e0d0: 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  0);.    pPager->
e0e0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
e0f0: 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ARED;..    /* If
e100: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
e110: 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  was in locking_m
e120: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
e130: 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
e140: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70  ger,.    ** drop
e150: 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
e160: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e170: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
e180: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
e190: 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  2==SQLITE_OK .  
e1a0: 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65     && !pPager->e
e1b0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
e1c0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c     && sqlite3Wal
e1d0: 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
e1e0: 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
e1f0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
e200: 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
e210: 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
e220: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  al, 0);.      rc
e230: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
e240: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
e250: 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  LOCK);.    }.  }
e260: 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
e270: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
e280: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
e290: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
e2a0: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
e2b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
e2c0: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
e2d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
e2e0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
e2f0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
e300: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
e310: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
e320: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e330: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
e340: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
e350: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
e360: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
e370: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
e380: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
e390: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  ;..  /* TODO: Is
e3a0: 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57   this optimal? W
e3b0: 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a  hy is the db siz
e3c0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65  e invalidated he
e3d0: 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  re .  ** when th
e3e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e3f0: 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f  is not unlocked?
e400: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
e410: 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20  OrigSize = 0;.  
e420: 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
e430: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
e440: 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
e450: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d  bSize);.  if( !M
e460: 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
e470: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
e480: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
e490: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
e4a0: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
e4b0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
e4c0: 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
e4d0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
e4e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
e4f0: 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
e500: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
e510: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
e520: 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
e530: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
e540: 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
e550: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
e560: 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
e570: 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
e580: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
e590: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
e5a0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
e5b0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
e5c0: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
e5d0: 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
e5e0: 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
e5f0: 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
e600: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
e610: 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
e620: 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
e630: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e640: 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
e650: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
e660: 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
e670: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
e680: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
e690: 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
e6a0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
e6b0: 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
e6c0: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
e6d0: 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
e6e0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
e6f0: 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
e700: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
e710: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
e720: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
e730: 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
e740: 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
e750: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
e760: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
e770: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
e780: 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
e790: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
e7a0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
e7b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
e7c0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
e7d0: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
e7e0: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
e7f0: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
e800: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
e810: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
e820: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
e830: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
e840: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
e850: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
e860: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
e870: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
e880: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
e890: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
e8a0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
e8b0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
e8c0: 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
e8d0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
e8e0: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
e8f0: 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
e900: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e910: 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
e920: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
e930: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
e940: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
e950: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
e960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
e970: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
e980: 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
e990: 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
e9a0: 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
e9b0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
e9c0: 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
e9d0: 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
e9e0: 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
e9f0: 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
ea00: 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
ea10: 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
ea20: 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
ea30: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
ea40: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
ea50: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
ea60: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
ea70: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
ea80: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
ea90: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
eaa0: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
eab0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
eac0: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
ead0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
eae0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
eaf0: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
eb00: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
eb10: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
eb20: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
eb30: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
eb40: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
eb50: 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
eb60: 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
eb70: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
eb80: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
eb90: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
eba0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
ebb0: 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
ebc0: 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
ebd0: 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
ebe0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
ebf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
ec00: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
ec10: 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
ec20: 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
ec30: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
ec40: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
ec50: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
ec60: 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
ec70: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
ec80: 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
ec90: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
eca0: 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
ecb0: 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
ecc0: 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
ecd0: 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
ece0: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
ecf0: 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
ed00: 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
ed10: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
ed20: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
ed30: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
ed40: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
ed50: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
ed60: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
ed70: 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
ed80: 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
ed90: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
eda0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
edb0: 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
edc0: 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
edd0: 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
ede0: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
edf0: 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
ee00: 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
ee10: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
ee20: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
ee30: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
ee40: 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
ee50: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
ee60: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
ee70: 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
ee80: 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
ee90: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
eea0: 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
eeb0: 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
eec0: 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
eed0: 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
eee0: 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
eef0: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
ef00: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ef10: 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
ef20: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
ef30: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
ef40: 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
ef50: 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
ef60: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
ef70: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
ef80: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
ef90: 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
efa0: 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
efb0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
efc0: 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
efd0: 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
efe0: 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
eff0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
f000: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
f010: 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
f020: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
f030: 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
f040: 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
f050: 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
f060: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
f070: 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
f080: 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
f090: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
f0a0: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
f0b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
f0c0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
f0d0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
f0e0: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
f0f0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f100: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
f110: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
f120: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
f130: 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
f140: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
f150: 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
f160: 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
f170: 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
f180: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
f190: 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
f1a0: 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
f1b0: 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
f1c0: 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
f1d0: 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
f1e0: 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
f1f0: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
f200: 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f220: 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
f230: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
f240: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
f250: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f270: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
f280: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
f290: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
f2c0: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
f2d0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
f2e0: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f300: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
f310: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
f320: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
f330: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
f340: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
f350: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
f360: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
f370: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
f380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f390: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
f3a0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
f3b0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
f3c0: 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
f3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
f3e0: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
f3f0: 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
f400: 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
f410: 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
f420: 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
f430: 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
f440: 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
f450: 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
f460: 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
f470: 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
f480: 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
f490: 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
f4a0: 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
f4b0: 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
f4c0: 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
f4d0: 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
f4e0: 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
f4f0: 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
f500: 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
f510: 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
f520: 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
f530: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
f540: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
f550: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
f560: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
f570: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
f580: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
f590: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
f5a0: 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61  er)==0 || (!isMa
f5b0: 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65  inJrnl && isSave
f5c0: 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  pnt) );..  /* Re
f5d0: 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
f5e0: 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
f5f0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f600: 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
f610: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
f620: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
f630: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
f640: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
f650: 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
f660: 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
f670: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
f680: 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
f690: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
f6a0: 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
f6b0: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
f6c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
f6d0: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
f6e0: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
f6f0: 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
f700: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
f710: 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
f720: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f730: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f740: 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
f750: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
f760: 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
f770: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
f780: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
f790: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
f7a0: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
f7b0: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
f7c0: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
f7d0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
f7e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
f7f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
f800: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
f810: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
f820: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
f830: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
f840: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
f850: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
f860: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
f870: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
f880: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
f890: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
f8a0: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
f8b0: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
f8c0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
f8d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
f8e0: 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
f8f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
f900: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
f910: 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
f920: 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
f930: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
f940: 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
f950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f960: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
f970: 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
f980: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
f990: 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
f9a0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
f9b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
f9c0: 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
f9d0: 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
f9e0: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
f9f0: 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
fa00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fa10: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
fa20: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44   }.  }..  if( pD
fa30: 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
fa40: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
fa50: 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
fa60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
fa70: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
fa80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
fa90: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
faa0: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
fab0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
fac0: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
fad0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
fae0: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
faf0: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
fb00: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
fb10: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
fb20: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
fb30: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
fb40: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
fb50: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
fb60: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
fb70: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
fb80: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
fb90: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
fba0: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
fbb0: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
fbc0: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
fbd0: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
fbe0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
fbf0: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
fc00: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
fc10: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
fc20: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
fc30: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
fc40: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
fc50: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
fc60: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
fc70: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
fc80: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
fc90: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
fca0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
fcb0: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
fcc0: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
fcd0: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
fce0: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
fcf0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
fd00: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
fd10: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
fd20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
fd30: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
fd40: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
fd50: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
fd60: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
fd70: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
fd80: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
fd90: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
fda0: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
fdb0: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
fdc0: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
fdd0: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
fde0: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
fdf0: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
fe00: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
fe10: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
fe20: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
fe30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
fe40: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
fe50: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
fe60: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
fe70: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
fe80: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
fe90: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
fea0: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
feb0: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
fec0: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
fed0: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
fee0: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
fef0: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
ff00: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
ff10: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
ff20: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
ff30: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
ff40: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
ff50: 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
ff60: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
ff70: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
ff80: 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
ff90: 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
ffa0: 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
ffb0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
ffc0: 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
ffd0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
ffe0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
fff0: 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
10000 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
10010 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
10020 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
10030 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
10040 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
10050 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
10060 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
10070 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
10080 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
10090 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
100a0 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
100b0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
100c0 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
100d0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
100e0 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
100f0 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
10100 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
10110 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
10120 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
10130 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
10140 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
10150 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
10160 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
10170 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
10180 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
10190 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
101a0 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
101b0 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
101c0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
101d0 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
101e0 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
101f0 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
10200 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
10210 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
10220 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
10230 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
10240 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
10250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
10260 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
10270 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
10280 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20  }.  assert( pPg 
10290 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50  || !MEMDB );.  P
102a0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
102b0 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
102c0 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
102d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
102e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
102f0 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
10300 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
10310 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
10320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
10330 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
10340 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
10350 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
10360 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
10370 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
10380 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
10390 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
103a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
103b0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
103c0 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
103d0 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
103e0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
103f0 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
10400 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
10410 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
10420 53 49 56 45 29 0a 20 20 20 26 26 20 69 73 4f 70  SIVE).   && isOp
10430 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
10440 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20    && isSynced.  
10450 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
10460 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
10470 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10480 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
10490 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50  !isSavepnt && pP
104a0 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c  g!=0 && (pPg->fl
104b0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
104c0 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  YNC)!=0 );.    a
104d0 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
104e0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
104f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10500 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
10510 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
10520 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
10530 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
10540 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
10550 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
10560 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
10570 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
10580 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
10590 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
105a0 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
105b0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
105c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
105d0 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  M);.      sqlite
105e0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
105f0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
10600 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
10610 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  ;.      CODEC2(p
10620 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
10630 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45  no, 7, rc=SQLITE
10640 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a  _NOMEM, aData);.
10650 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
10660 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
10670 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
10680 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
10690 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
106a0 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
106b0 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
106c0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
106d0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
106e0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
106f0 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
10700 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
10710 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
10720 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
10730 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
10740 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
10750 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
10760 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
10770 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
10780 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
10790 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
107a0 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
107b0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
107c0 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
107d0 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
107e0 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
107f0 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
10800 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
10810 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
10820 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
10830 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
10840 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
10850 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
10860 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
10870 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
10880 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
10890 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
108a0 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
108b0 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
108c0 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
108d0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
108e0 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
108f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
10900 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
10910 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
10920 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
10930 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
10940 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
10950 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
10960 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
10970 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
10980 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
10990 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
109a0 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
109b0 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
109c0 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
109d0 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
109e0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
109f0 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
10a00 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
10a10 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
10a20 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
10a30 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  pPg, 1))!=SQLITE
10a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
10a50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
10a60 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
10a70 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
10a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
10a90 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
10aa0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
10ab0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
10ac0 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
10ad0 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
10ae0 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
10af0 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
10b00 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
10b10 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
10b20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
10b30 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
10b40 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
10b50 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
10b60 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
10b70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
10b80 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
10b90 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
10ba0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
10bb0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
10bc0 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
10bd0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
10be0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
10bf0 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
10c00 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
10c10 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
10c20 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
10c30 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
10c40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
10c50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
10c60 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
10c70 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
10c80 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
10c90 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
10ca0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
10cb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
10cc0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
10cd0 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
10ce0 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
10cf0 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
10d00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
10d10 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
10d20 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
10d30 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
10d40 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
10d50 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
10d60 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
10d70 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
10d80 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
10d90 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
10da0 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
10db0 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
10dc0 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
10dd0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
10de0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
10df0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
10e00 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
10e10 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
10e20 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
10e30 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
10e40 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
10e50 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
10e60 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
10e70 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
10e80 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
10e90 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
10ea0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
10eb0 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
10ec0 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
10ed0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
10ee0 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
10ef0 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
10f00 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
10f10 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
10f20 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
10f30 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
10f40 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
10f50 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
10f60 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
10f70 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
10f80 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
10f90 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
10fa0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
10fb0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
10fc0 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
10fd0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
10fe0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
10ff0 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
11000 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
11010 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
11020 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
11030 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
11040 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
11050 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
11060 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
11070 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
11080 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
11090 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
110a0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
110b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
110c0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
110d0 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
110e0 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
110f0 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
11100 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
11110 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
11120 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
11130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
11140 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
11150 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
11160 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
11170 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
11180 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
11190 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
111a0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
111b0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
111c0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
111d0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
111e0 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
111f0 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
11200 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
11210 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f  eVers..    ** Do
11220 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79   this before any
11230 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   decoding. */.  
11240 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
11250 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70  .      memcpy(&p
11260 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
11270 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29  s, &((u8*)pData)
11280 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67  [24],sizeof(pPag
11290 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
112a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
112b0 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20  Decode the page 
112c0 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64  just read from d
112d0 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43  isk */.    CODEC
112e0 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
112f0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
11300 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
11310 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
11320 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
11330 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
11350 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
11360 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
11370 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11380 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
11390 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
113a0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
113b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
113c0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
113d0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
113e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
113f0 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
11400 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
11410 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11420 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
11430 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
11440 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
11450 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
11460 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
11470 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
11480 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
11490 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
114a0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
114b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
114c0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
114d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
114e0 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
114f0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
11500 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
11510 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
11520 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
11530 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
11540 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
11550 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
11560 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
11570 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
11580 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
11590 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
115a0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
115b0 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
115c0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
115d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
115e0 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
115f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
11600 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
11610 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
11620 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
11630 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
11640 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
11650 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
11660 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
11670 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
11680 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
11690 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
116a0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
116b0 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
116c0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
116d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
116e0 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
116f0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
11700 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
11710 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
11720 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
11730 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
11740 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
11750 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
11760 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
11770 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
11780 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
11790 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
117a0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
117b0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
117c0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
117d0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
117e0 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
117f0 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
11800 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
11810 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
11820 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
11830 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
11840 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
11850 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
11860 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
11870 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
11880 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
11890 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
118a0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
118b0 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
118c0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
118d0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
118e0 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
118f0 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
11900 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
11910 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
11920 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
11930 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
11940 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
11950 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
11960 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
11970 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
11980 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
11990 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
119a0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
119b0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
119c0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
119d0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
119e0 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
119f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
11a00 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
11a10 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
11a20 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
11a30 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
11a40 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
11a50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11a60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11a70 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
11a80 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
11a90 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
11aa0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
11ab0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
11ac0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
11ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11ae0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
11af0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
11b00 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
11b10 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
11b20 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
11b30 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
11b60 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
11b70 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
11b80 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
11b90 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
11ba0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
11bb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
11bc0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
11bd0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
11be0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
11bf0 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
11c00 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
11c10 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
11c20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
11c30 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
11c40 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
11c50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11c60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11c70 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  file */..  /* Al
11c80 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
11c90 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e   both the pJourn
11ca0 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66  al and pMaster f
11cb0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e  ile descriptors.
11cc0 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73  .  ** If success
11cd0 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61  ful, open the ma
11ce0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11cf0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20  e for reading.. 
11d00 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
11d10 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
11d20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
11d30 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  o(pVfs->szOsFile
11d40 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
11d50 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
11d60 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
11d70 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
11d80 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
11d90 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
11da0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
11dc0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
11dd0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
11de0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
11df0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
11e00 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
11e10 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
11e20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
11e30 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
11e40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11e50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
11e60 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63  aster_out;..  rc
11e70 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
11e80 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
11e90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
11ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11eb0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
11ec0 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
11ed0 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
11ee0 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
11ef0 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
11f00 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
11f10 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74  0;.    int nMast
11f20 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78  erPtr = pVfs->mx
11f30 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20  Pathname+1;..   
11f40 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
11f50 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
11f60 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
11f70 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
11f80 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
11f90 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  malloc() and poi
11fa0 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
11fb0 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  erJournal. .    
11fc0 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  */.    zMasterJo
11fd0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
11fe0 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
11ff0 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
12000 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 20  terPtr + 1);.   
12010 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
12020 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
12030 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12040 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
12050 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
12060 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20  .    zMasterPtr 
12070 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
12080 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
12090 2b 31 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  +1];.    rc = sq
120a0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
120b0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
120c0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
120d0 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
120e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
120f0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
12100 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7a 4d  ster_out;.    zM
12110 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
12120 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
12130 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
12140 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
12150 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
12160 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
12170 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
12180 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
12190 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20  nt exists;.     
121a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
121b0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
121c0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
121d0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
121e0 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sts);.      if( 
121f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12200 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
12210 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
12220 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
12230 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
12240 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
12250 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
12260 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
12270 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
12280 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
12290 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
122a0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
122b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
122c0 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
122d0 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
122e0 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
122f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12300 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
12310 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
12320 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73         int flags
12330 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
12340 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
12350 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
12360 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  L);.        rc =
12370 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
12380 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
12390 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
123a0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
123b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
123c0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
123d0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
123e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
123f0 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
12400 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
12410 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
12420 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
12430 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12440 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
12450 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12470 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12480 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
12490 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
124a0 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
124b0 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
124c0 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
124d0 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
124e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
124f0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
12500 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
12510 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12520 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
12530 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
12540 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
12550 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12560 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
12570 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12580 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
12590 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20    }.  }.  .  rc 
125a0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
125b0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
125c0 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
125d0 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
125e0 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
125f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
12600 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
12610 20 7d 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74   }  .  if( pMast
12620 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
12630 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
12640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
12650 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
12660 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
12670 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
12680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12690 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
126a0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
126b0 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
126c0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
126d0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
126e0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
126f0 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
12700 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
12710 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
12720 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
12730 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
12740 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
12750 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
12760 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
12770 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
12780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12790 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61  s not open, or a
127a0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
127b0 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c   is not.** held,
127c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
127d0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
127e0 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f  wise, the size o
127f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a  f the file is.**
12800 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
12810 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
12820 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
12830 62 79 74 65 73 29 2e 20 49 66 20 74 68 65 20 66  bytes). If the f
12840 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69  ile.** on disk i
12850 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
12860 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
12870 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
12880 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
12890 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
128a0 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
128b0 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d  * Or, it might m
128c0 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
128d0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
128e0 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
128f0 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
12900 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
12910 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
12920 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
12930 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
12940 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
12950 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
12960 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
12970 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
12980 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
12990 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
129a0 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
129b0 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
129c0 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
129d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
129e0 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
129f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
12a00 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
12a10 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
12a20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
12a30 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
12a40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12a50 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
12a60 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
12a70 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
12a80 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
12a90 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
12aa0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
12ab0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12ac0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
12ad0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
12ae0 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 69  R_EXCLUSIVE && i
12af0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
12b00 29 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72  ) ){.    i64 cur
12b10 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
12b20 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  e;.    /* TODO: 
12b30 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
12b40 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
12b50 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
12b60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
12b70 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
12b80 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
12b90 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
12ba0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12bb0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
12bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12bd0 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
12be0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
12bf0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
12c00 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
12c10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12c20 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
12c30 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
12c40 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12c50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12c60 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
12c70 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20  ger->fd, "", 1, 
12c80 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  newSize-1);.    
12c90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
12ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12cb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
12cc0 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
12cd0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
12ce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
12d00 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
12d10 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
12d20 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
12d30 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
12d40 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
12d50 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
12d60 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
12d70 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
12d80 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
12d90 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
12da0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
12db0 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
12dc0 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
12dd0 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
12de0 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
12df0 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
12e00 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
12e10 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
12e20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
12e30 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
12e40 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
12e50 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
12e60 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
12e70 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
12e80 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
12e90 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
12ea0 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
12eb0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
12ec0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
12ed0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
12ee0 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
12ef0 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33   rounded up to 3
12f00 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
12f10 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72  ss than 32, or r
12f20 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d  ounded down to M
12f30 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
12f40 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74  f it.** is great
12f50 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54  er than MAX_SECT
12f60 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74  OR_SIZE..*/.stat
12f70 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f  ic void setSecto
12f80 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
12f90 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
12fa0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12fb0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
12fc0 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
12fd0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
12fe0 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
12ff0 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
13000 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
13010 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
13020 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
13030 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
13040 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
13050 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
13060 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
13070 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
13080 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
13090 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
130a0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
130b0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
130c0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
130d0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
130e0 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20 29 7b  sectorSize<32 ){
130f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
13100 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20  torSize = 512;. 
13110 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
13120 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  >sectorSize>MAX_
13130 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
13140 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
13150 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
13160 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
13170 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f  ectorSize = MAX_
13180 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
13190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
131a0 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
131b0 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
131c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
131d0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
131e0 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
131f0 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
13200 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
13210 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
13220 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
13230 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
13240 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
13250 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
13260 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
13270 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
13280 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
13290 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
132a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
132b0 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
132c0 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
132d0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
132e0 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
132f0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
13300 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
13310 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
13320 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
13330 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
13340 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
13350 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
13360 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
13370 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
13380 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
13390 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
133a0 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
133b0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
133c0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
133d0 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
133e0 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
133f0 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
13400 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
13410 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62  *  (5)  4 byte b
13420 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
13430 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
13440 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65  ector size.  The
13450 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20   header.**      
13460 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79   is this many by
13470 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20  tes in size..** 
13480 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67   (6)  4 byte big
13490 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
134a0 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67  which is the pag
134b0 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20  e size..**  (7) 
134c0 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75   zero padding ou
134d0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  t to the next se
134e0 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  ctor size..**  (
134f0 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  8)  Zero or more
13500 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
13510 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
13520 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
13530 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
13540 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
13550 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13560 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
13570 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
13580 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
13590 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
135a0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
135b0 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
135c0 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65   the first 7 ite
135d0 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
135e0 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
135f0 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
13600 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68  tance of the 8th
13610 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
13620 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
13630 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
13640 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
13650 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
13660 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
13670 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
13680 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
13690 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
136a0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
136b0 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
136c0 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
136d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
136e0 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
136f0 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
13700 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
13710 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
13720 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
13730 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
13740 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
13750 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13760 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
13770 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
13780 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
13790 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
137a0 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
137b0 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
137c0 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
137d0 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
137e0 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
137f0 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
13800 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
13810 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
13820 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
13830 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
13840 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
13850 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
13860 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
13870 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
13880 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
13890 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
138a0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
138b0 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
138c0 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
138d0 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
138e0 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
138f0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
13900 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
13910 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
13920 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
13930 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
13940 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
13950 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
13960 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
13970 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
13980 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
13990 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
139a0 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
139b0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
139c0 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
139d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
139e0 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
139f0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
13a00 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
13a10 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
13a20 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
13a30 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
13a40 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
13a50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
13a60 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
13a70 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
13a80 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
13a90 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
13aa0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
13ab0 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
13ac0 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
13ad0 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
13ae0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
13af0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
13b00 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
13b10 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
13b20 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
13b30 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
13b40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
13b50 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61  * The isHot para
13b60 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
13b70 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69  that we are tryi
13b80 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  ng to rollback a
13b90 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74   journal.** that
13ba0 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20   might be a hot 
13bb0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74  journal.  Or, it
13bc0 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74   could be that t
13bd0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a  he journal is .*
13be0 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61  * preserved beca
13bf0 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f  use of JOURNALMO
13c00 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f  DE_PERSIST or JO
13c10 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13c20 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  TE..** If the jo
13c30 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20  urnal really is 
13c40 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70  hot, reset the p
13c50 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72  ager cache prior
13c60 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b   rolling.** back
13c70 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49   any content.  I
13c80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  f the journal is
13c90 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65   merely persiste
13ca0 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a  nt, no reset is.
13cb0 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  ** needed..*/.st
13cc0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
13cd0 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
13ce0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
13cf0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
13d00 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
13d10 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
13d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13d30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
13d40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
13d50 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
13d60 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
13d70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13d80 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
13d90 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
13da0 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
13db0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
13dc0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
13dd0 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
13de0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
13df0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
13e00 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
13e10 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
13e40 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
13e50 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
13e60 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
13e70 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
13e80 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
13e90 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
13ea0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
13eb0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
13ec0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
13ed0 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  le if any */.  i
13ee0 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  nt needPagerRese
13ef0 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  t;      /* True 
13f00 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72  to reset page pr
13f10 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67  ior to first pag
13f20 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20  e rollback */.. 
13f30 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
13f40 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
13f50 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
13f60 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
13f70 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
13f80 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
13f90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
13fa0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
13fb0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
13fc0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
13fd0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
13fe0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13ff0 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20  TE_OK || szJ==0 
14000 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
14010 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
14020 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
14030 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
14040 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14050 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
14060 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
14070 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
14080 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
14090 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
140a0 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
140b0 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
140c0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
140d0 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
140e0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
140f0 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
14100 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
14110 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
14120 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
14130 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
14140 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
14150 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
14160 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
14170 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
14180 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
14190 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
141a0 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
141b0 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
141c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
141d0 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
141e0 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74  x.c,.  **  mxPat
141f0 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
14200 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
14210 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
14220 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
14230 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
14240 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
14250 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
14260 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
14270 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
14280 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
14290 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
142a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
142b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
142c0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
142d0 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
142e0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
142f0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
14300 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
14310 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
14320 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
14330 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14340 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
14350 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14360 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
14370 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14380 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
14390 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
143a0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
143b0 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
143c0 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
143d0 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
143e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
143f0 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
14400 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
14410 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
14420 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
14430 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
14440 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
14450 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
14460 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
14470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
14480 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
14490 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
144a0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
144b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
144c0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
144d0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
144e0 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
144f0 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
14500 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
14510 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
14520 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
14530 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
14540 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
14550 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
14560 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
14570 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
14580 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
14590 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
145a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
145b0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
145c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
145d0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
145e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
145f0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
14600 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
14610 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
14620 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
14630 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
14640 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
14650 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
14660 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
14670 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
14680 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
14690 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
146a0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
146b0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
146c0 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
146d0 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
146e0 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
146f0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
14700 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
14710 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
14720 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
14730 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
14740 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
14750 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14760 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
14770 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
14780 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
14790 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
147a0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
147b0 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
147c0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
147d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
147e0 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
147f0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
14800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
14810 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
14820 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
14830 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
14840 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
14850 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
14860 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
14870 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
14880 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
14890 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
148a0 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
148b0 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
148c0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
148d0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
148e0 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
148f0 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
14900 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
14910 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
14920 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
14930 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
14940 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
14950 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
14960 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
14970 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
14980 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
14990 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
149a0 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
149b0 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
149c0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
149d0 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
149e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
149f0 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
14a00 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
14a10 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
14a20 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
14a30 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
14a40 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
14a50 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
14a60 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
14a70 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
14a80 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
14a90 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
14aa0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
14ab0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
14ac0 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
14ad0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
14ae0 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
14af0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
14b00 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
14b10 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
14b20 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
14b30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
14b40 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
14b50 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
14b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
14b70 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
14b80 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
14b90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
14ba0 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
14bb0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
14bc0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
14bd0 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
14be0 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
14bf0 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
14c00 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
14c10 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
14c20 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
14c30 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
14c40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
14c50 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
14c60 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
14c70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
14c80 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
14c90 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
14ca0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14cb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14cc0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14cd0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
14ce0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
14cf0 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
14d00 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
14d10 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
14d20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
14d30 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
14d40 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
14d50 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
14d60 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
14d70 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
14d80 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
14d90 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
14da0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
14db0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
14dc0 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
14dd0 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
14de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
14df0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
14e00 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
14e10 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
14e20 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
14e30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14e50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14e60 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
14e70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14e80 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
14e90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14ea0 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
14eb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
14ec0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
14ed0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
14ee0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
14ef0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
14f00 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e  al has been trun
14f10 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74  cated, simply st
14f20 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20  op reading and. 
14f30 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
14f40 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  essing the journ
14f50 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68  al. This might h
14f60 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75  appen if the jou
14f70 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20  rnal was.       
14f80 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65     ** not comple
14f90 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64  tely written and
14fa0 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f   synced prior to
14fb0 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68   a crash.  In th
14fc0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
14fd0 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62 61  case, the databa
14fe0 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e  se should have n
14ff0 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
15000 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  n in the.       
15010 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63     ** first plac
15020 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f  e so it is OK to
15030 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20   simply abandon 
15040 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f  the rollback. */
15050 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
15070 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
15080 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
15090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
150a0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
150b0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
150c0 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75 72  , quit and retur
150d0 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  n the error.    
150e0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20        ** code.  
150f0 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
15100 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
15110 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
15120 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  te.          ** 
15130 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68  so that no furth
15140 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20  er harm will be 
15150 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74  done.  Perhaps t
15160 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20  he next.        
15170 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20    ** process to 
15180 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20  come along will 
15190 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
151a0 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ack the database
151b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
151c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
151d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
151e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
151f0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
15200 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
15210 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
15220 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
15230 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
15240 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
15250 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
15260 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
15270 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
15280 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
15290 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
152a0 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
152b0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
152c0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
152d0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
152e0 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
152f0 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
15300 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
15310 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
15320 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
15330 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20   */.  assert(.  
15340 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d    pPager->fd->pM
15350 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20  ethods==0 ||.   
15360 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15370 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
15380 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
15390 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53  _UNCHANGED,0)>=S
153a0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20  QLITE_OK.  );.. 
153b0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
153c0 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
153d0 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
153e0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
153f0 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
15400 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
15410 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
15420 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
15430 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
15440 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
15450 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
15460 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
15470 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
15480 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
15490 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
154a0 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
154b0 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
154c0 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
154d0 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
154e0 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
154f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
15500 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
15510 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
15520 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
15530 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
15540 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
15550 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
15560 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
15570 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
15580 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
15590 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
155a0 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
155b0 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
155c0 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
155d0 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
155e0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
155f0 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
15600 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
15610 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
15620 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
15630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15640 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
15650 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
15660 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
15670 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
15680 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
15690 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
156a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
156b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
156c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
156d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
156e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
156f0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
15700 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
15710 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
15720 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15730 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
15740 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
15750 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
15760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15770 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  _OK && pPager->n
15780 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  oSync==0 && pPag
15790 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
157a0 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
157b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
157c0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
157d0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
157e0 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ags);.  }.  if( 
157f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15800 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
15810 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
15820 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b  pPager, zMaster[
15830 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74  0]!='\0');.    t
15840 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
15850 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
15860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15870 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
15880 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a  && res ){.    /*
15890 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
158a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
158b0 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
158c0 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63  will return succ
158d0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  ess,.    ** see 
158e0 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
158f0 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
15900 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
15910 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
15920 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
15930 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
15940 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
15950 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15960 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
15970 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
15980 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
15990 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
159a0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
159b0 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
159c0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
159d0 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
159e0 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
159f0 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
15a00 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
15a10 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
15a20 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
15a30 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
15a40 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
15a50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
15a60 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
15a70 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
15a80 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
15a90 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
15aa0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
15ab0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
15ac0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
15ad0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
15ae0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
15af0 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
15b00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
15b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
15b20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
15b30 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
15b40 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
15b50 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
15b60 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
15b70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15b80 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
15b90 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
15ba0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
15bb0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
15bc0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
15bd0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
15be0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
15bf0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15c00 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
15c10 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
15c20 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
15c30 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
15c40 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
15c50 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
15c60 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
15c70 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
15c80 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
15c90 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
15ca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15cb0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
15cc0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
15cd0 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b  int isInWal = 0;
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15cf0 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73 20  True if page is 
15d00 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20  in log file */. 
15d10 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67   int pgsz = pPag
15d20 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a  er->pageSize; /*
15d30 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15d40 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61   to read */..  a
15d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
15d60 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
15d70 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ED && !MEMDB );.
15d80 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
15d90 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
15da0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73  .  if( NEVER(!is
15db0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
15dc0 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
15dd0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
15de0 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
15df0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
15e00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15e10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15e20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
15e30 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
15e40 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
15e50 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65   Try to pull the
15e60 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77   page from the w
15e70 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20  rite-ahead log. 
15e80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
15e90 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65  te3WalRead(pPage
15ea0 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
15eb0 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70  isInWal, pgsz, p
15ec0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a  Pg->pData);.  }.
15ed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ee0 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20  _OK && !isInWal 
15ef0 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73  ){.    i64 iOffs
15f00 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
15f10 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
15f20 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
15f30 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
15f40 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
15f50 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65  ta, pgsz, iOffse
15f60 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
15f70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
15f80 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
15f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15fb0 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
15fc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
15fd0 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
15fe0 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
15ff0 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
16000 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
16010 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
16020 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
16030 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
16040 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
16050 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
16060 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
16070 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
16080 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
16090 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
160a0 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
160b0 65 72 6f 2e 20 20 42 79 74 65 73 20 33 32 2e 2e  ero.  Bytes 32..
160c0 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 20 73 68  35 and 35..39 sh
160d0 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
160e0 62 65 72 73 20 77 68 69 63 68 20 61 72 65 0a 20  bers which are. 
160f0 20 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 30 78       ** never 0x
16100 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
16110 6c 6c 69 6e 67 20 70 50 61 67 65 72 2d 3e 64 62  lling pPager->db
16120 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
16130 61 6c 6c 20 30 78 66 66 0a 20 20 20 20 20 20 2a  all 0xff.      *
16140 2a 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  * bytes should s
16150 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
16160 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
16170 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
16180 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
16190 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
161a0 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
161b0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
161c0 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
161d0 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
161e0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
161f0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
16200 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
16210 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
16220 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
16230 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
16240 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
16250 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
16260 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
16270 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
16280 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
16290 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
162a0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
162b0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
162c0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
162d0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
162e0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
162f0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
16300 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
16310 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
16320 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
16330 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
16340 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
16350 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
16360 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
16370 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
16380 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
16390 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
163a0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
163b0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
163c0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
163d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
163e0 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
163f0 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
16400 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16410 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16420 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
16430 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
16440 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
16450 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
16460 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
16470 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
16480 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16490 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
164a0 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
164b0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
164c0 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
164d0 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
164e0 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
164f0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
16500 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
16510 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
16520 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
16530 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
16540 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
16550 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
16560 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
16570 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
16580 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
16590 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
165a0 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
165b0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
165c0 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
165d0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
165e0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
165f0 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
16600 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
16610 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
16620 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
16630 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
16640 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
16650 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
16660 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
16670 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
16680 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
16690 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
166a0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
166b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
166c0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
166d0 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
166e0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
166f0 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
16700 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
16710 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16720 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
16730 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
16740 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
16750 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
16760 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
16770 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
16780 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
16790 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
167a0 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
167b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
167c0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
167d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
167e0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
167f0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
16800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16810 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
16820 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
16830 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16840 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
16850 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ef(pPg);.    }. 
16860 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
16870 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
16880 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
16890 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
168a0 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
168b0 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
168c0 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
168d0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
168e0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
168f0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
16900 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
16910 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
16920 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
16930 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
16940 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
16950 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
16960 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
16970 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
16980 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
16990 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
169a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
169b0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
169c0 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
169d0 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
169e0 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
169f0 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
16a00 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
16a10 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
16a20 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
16a30 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
16a40 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
16a50 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
16a60 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
16a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
16a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16a90 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
16aa0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
16ab0 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
16ac0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
16ad0 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
16ae0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
16af0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
16b20 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
16b30 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
16b40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
16b50 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
16b60 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
16b70 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
16b80 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
16b90 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
16ba0 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
16bb0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
16bc0 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
16bd0 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
16be0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
16bf0 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
16c00 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
16c10 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
16c20 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
16c30 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
16c40 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
16c50 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
16c60 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
16c70 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
16c80 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
16c90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
16ca0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
16cb0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
16cc0 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
16cd0 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
16ce0 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
16cf0 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
16d00 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
16d10 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
16d20 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
16d30 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
16d40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16d50 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
16d60 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
16d70 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
16d80 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
16d90 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
16da0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
16db0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
16dc0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
16dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16de0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
16df0 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
16e00 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
16e10 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
16e20 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
16e30 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
16e40 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
16e50 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
16e60 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
16e70 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
16e80 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
16e90 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
16ea0 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
16eb0 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
16ec0 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74 69  nged. .*/ .stati
16ed0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
16ee0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
16ef0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
16f00 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
16f10 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
16f20 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16f40 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
16f50 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
16f60 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
16f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
16f80 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
16f90 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
16fa0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
16fd0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
16fe0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c 61  /.  int sync_fla
16ff0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
17000 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
17010 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
17020 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
17030 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
17060 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
17070 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 72  ger->pWal );.  r
17080 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
17090 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
170a0 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
170b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
170c0 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
170d0 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c 61  Commit, sync_fla
170e0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
170f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
17100 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
17110 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
17120 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
17130 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
17140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
17150 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
17160 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
17170 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
17180 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
17190 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
171a0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 57 41  ./*.** Open a WA
171b0 4c 20 73 6e 61 70 73 68 6f 74 20 6f 6e 20 74 68  L snapshot on th
171c0 65 20 6c 6f 67 20 66 69 6c 65 20 74 68 69 73 20  e log file this 
171d0 70 61 67 65 72 20 69 73 20 63 6f 6e 6e 65 63 74  pager is connect
171e0 65 64 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ed to..*/.static
171f0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 53 6e   int pagerOpenSn
17200 61 70 73 68 6f 74 28 50 61 67 65 72 20 2a 70 50  apshot(Pager *pP
17210 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17240 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
17250 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20   changed = 0;   
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17270 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d 75  True if cache mu
17280 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a  st be reset */..
17290 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
172a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
172b0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
172c0 57 61 6c 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28  WalOpenSnapshot(
172d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
172e0 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
172f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17300 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20      int dummy;. 
17310 20 20 20 69 66 28 20 63 68 61 6e 67 65 64 20 29     if( changed )
17320 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
17330 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
17340 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17350 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
17360 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
17370 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
17380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17390 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
173a0 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ger, &dummy);.  
173b0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  }.  pPager->stat
173c0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
173d0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
173e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
173f0 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
17400 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
17410 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
17420 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
17430 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e 20 41 73  er.** exists. As
17440 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20  suming no error 
17450 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 45 78  occurs, set *pEx
17460 69 73 74 73 20 74 6f 20 31 20 69 66 20 74 68 65  ists to 1 if the
17470 20 66 69 6c 65 20 65 78 69 73 74 73 2c 0a 2a 2a   file exists,.**
17480 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 20   or 0 otherwise 
17490 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
174a0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 6f  E_OK. If an IO o
174b0 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  r OOM error occu
174c0 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 6e  rs, return.** an
174d0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
174e0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
174f0 74 20 70 61 67 65 72 48 61 73 57 41 4c 28 50 61  t pagerHasWAL(Pa
17500 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17510 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 69 6e   *pExists){.  in
17520 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17540 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17550 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
17560 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
17570 63 68 61 72 20 2a 7a 57 61 6c 20 3d 20 73 71 6c  char *zWal = sql
17580 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
17590 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e 7a  -wal", pPager->z
175a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
175b0 66 28 20 21 7a 57 61 6c 20 29 7b 0a 20 20 20 20  f( !zWal ){.    
175c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
175d0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
175e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
175f0 65 33 4f 73 41 63 63 65 73 73 28 70 50 61 67 65  e3OsAccess(pPage
17600 72 2d 3e 70 56 66 73 2c 20 7a 57 61 6c 2c 20 53  r->pVfs, zWal, S
17610 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
17620 53 54 53 2c 20 70 45 78 69 73 74 73 29 3b 0a 20  STS, pExists);. 
17630 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17640 65 28 7a 57 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zWal);.    }. 
17650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
17660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17670 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
17680 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17690 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
176a0 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
176b0 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
176c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
176d0 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
176e0 72 0a 2a 2a 20 65 78 69 73 74 73 2e 20 49 66 20  r.** exists. If 
176f0 69 74 20 64 6f 65 73 2c 20 6f 70 65 6e 20 74 68  it does, open th
17700 65 20 70 61 67 65 72 20 69 6e 20 57 41 4c 20 6d  e pager in WAL m
17710 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
17720 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f  if no error.** o
17730 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
17740 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
17750 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
17760 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
17770 44 45 5f 57 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e  DE_WAL..** If an
17780 20 49 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72   IO or OOM error
17790 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
177a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
177b0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  code..**.** If t
177c0 68 65 20 57 41 4c 20 66 69 6c 65 20 69 73 20 6f  he WAL file is o
177d0 70 65 6e 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e  pened, also open
177e0 20 61 20 73 6e 61 70 73 68 6f 74 20 28 72 65 61   a snapshot (rea
177f0 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  d transaction)..
17800 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
17810 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
17820 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
17830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
17840 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
17850 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
17860 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
17870 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
17880 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
17890 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
178a0 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
178b0 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
178c0 63 6f 6e 64 69 74 69 6f 6e 20 62 65 74 77 65 65  condition betwee
178d0 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
178e0 0a 2a 2a 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  .** below and an
178f0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
17900 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
17910 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
17920 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
17930 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
17940 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
17950 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
17960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17970 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
17980 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
17990 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
179a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
179b0 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
179c0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72 63 20  xists */.    rc 
179d0 3d 20 70 61 67 65 72 48 61 73 57 41 4c 28 70 50  = pagerHasWAL(pP
179e0 61 67 65 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20  ager, &isWal);. 
179f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
17a10 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20  ( isWal ){.     
17a20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17a30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17a40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17a50 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
17a60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17a80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
17a90 20 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68   pagerOpenSnapsh
17aa0 6f 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ot(pPager);.    
17ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
17ac0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
17ad0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
17ae0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
17af0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
17b00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
17b10 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
17b20 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
17b30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
17b40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17b50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
17b60 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
17b70 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
17b80 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
17b90 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
17ba0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
17bb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17bc0 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
17bd0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
17be0 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
17bf0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
17c00 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
17c10 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
17c20 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
17c30 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
17c40 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
17c50 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
17c60 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
17c70 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
17c80 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
17c90 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
17ca0 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
17cb0 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
17cc0 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
17cd0 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
17ce0 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
17cf0 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
17d00 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
17d10 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
17d20 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17d30 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
17d40 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
17d50 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
17d60 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
17d70 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
17d80 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
17d90 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
17da0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17db0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
17dc0 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
17dd0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
17de0 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
17df0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
17e00 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
17e10 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
17e20 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
17e30 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
17e40 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
17e50 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
17e60 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
17e70 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
17e80 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
17e90 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
17ea0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17eb0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
17ec0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
17ed0 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
17ee0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
17ef0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
17f00 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
17f10 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
17f20 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
17f30 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
17f40 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
17f50 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
17f60 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
17f70 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
17f80 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
17f90 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
17fa0 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
17fb0 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
17fc0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
17fd0 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
17fe0 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
17ff0 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
18000 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
18010 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
18020 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
18030 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
18040 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
18050 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
18060 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
18070 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
18080 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
18090 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
180a0 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
180b0 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
180c0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
180d0 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
180e0 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
180f0 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
18100 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
18110 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
18120 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
18130 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
18140 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
18150 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
18160 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
18170 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
18180 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
18190 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
181a0 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
181b0 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
181c0 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
181d0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
181e0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
181f0 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
18200 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
18210 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
18220 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
18230 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
18240 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
18250 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
18260 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
18270 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
18280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18290 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
182a0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
182b0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
182c0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
182d0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
182e0 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
182f0 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
18300 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
18310 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
18320 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
18330 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
18340 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
18350 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
18360 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
18370 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
18380 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
18390 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
183a0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
183b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
183c0 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
183d0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
183e0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
183f0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
18400 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
18410 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
18420 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
18430 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
18440 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
18450 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18460 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
18470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
18480 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
18490 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
184a0 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
184b0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
184c0 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
184d0 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
184e0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
184f0 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
18500 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
18510 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
18520 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20  >dbOrigSize;..  
18530 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
18540 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
18550 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
18560 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
18570 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
18580 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
18590 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
185a0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
185b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
185c0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
185d0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
185e0 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
185f0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
18600 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
18610 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
18620 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
18630 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
18640 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
18650 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
18660 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
18670 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
18680 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
18690 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
186a0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
186b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
186c0 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
186d0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
186e0 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
186f0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
18700 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
18710 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
18720 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
18730 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
18740 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
18750 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
18760 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
18770 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
18780 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
18790 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
187a0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
187b0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
187c0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
187d0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
187e0 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
187f0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
18800 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
18810 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
18820 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
18830 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
18840 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
18850 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
18860 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
18870 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
18880 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
18890 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
188a0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
188b0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
188c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
188d0 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
188e0 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
188f0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
18900 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
18910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
18920 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
18930 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
18940 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
18950 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
18960 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
18970 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
18980 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
18990 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
189a0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
189b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
189c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
189d0 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
189e0 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
189f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
18a00 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
18a10 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
18a20 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
18a30 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
18a40 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
18a50 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
18a60 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
18a70 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
18a80 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
18a90 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
18aa0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
18ab0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
18ac0 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
18ad0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
18ae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18af0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18b00 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
18b10 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
18b20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
18b30 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
18b40 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
18b50 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
18b60 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
18b70 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
18b80 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
18b90 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
18ba0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
18bb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
18bc0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
18bd0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
18be0 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
18bf0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
18c00 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
18c10 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
18c20 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
18c30 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
18c40 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
18c50 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
18c60 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
18c70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
18c80 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
18c90 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
18ca0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
18cb0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
18cc0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
18cd0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
18ce0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
18cf0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
18d00 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
18d10 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
18d20 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
18d30 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
18d40 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
18d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
18d60 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
18d70 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
18d80 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
18d90 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
18da0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
18db0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
18dc0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
18dd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
18de0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
18df0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
18e10 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
18e20 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
18e30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
18e40 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a  nalOff==szJ );..
18e50 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
18e60 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
18e70 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
18e80 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
18e90 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
18ea0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
18eb0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
18ec0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
18ed0 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
18ee0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
18ef0 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
18f00 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
18f10 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
18f20 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
18f30 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
18f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18f50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
18f60 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
18f70 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75   pSavepoint->iSu
18f80 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
18f90 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
18fa0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
18fb0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
18fc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
18fd0 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50  SavepointUndo(pP
18fe0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76  ager->pWal, pSav
18ff0 65 70 6f 69 6e 74 2d 3e 69 46 72 61 6d 65 29 3b  epoint->iFrame);
19000 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
19010 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
19020 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
19030 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
19040 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
19050 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19060 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70   offset==ii*(4+p
19070 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
19080 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
19090 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
190a0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
190b0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
190c0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
190d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
190e0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
190f0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
19100 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
19110 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19120 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
19130 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
19140 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
19150 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
19160 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
19170 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
19180 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
19190 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
191a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
191b0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
191c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
191d0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
191e0 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
191f0 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
19200 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
19210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
19220 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
19230 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19240 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
19250 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
19260 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
19270 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
19280 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
19290 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
192a0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
192b0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
192c0 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
192d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
192e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
192f0 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
19300 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
19310 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
19320 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
19330 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
19340 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
19350 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
19360 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
19370 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
19380 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
19390 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
193a0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
193b0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
193c0 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
193d0 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
193f0 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
19400 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
19410 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
19420 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19430 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
19440 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
19450 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
19460 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
19470 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
19480 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
19490 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
194a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
194c0 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
194d0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
194e0 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
194f0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
19500 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
19510 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
19520 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19530 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
19540 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
19550 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
19560 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
19570 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
19580 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
19590 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
195a0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
195b0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
195c0 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
195d0 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
195e0 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
195f0 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
19600 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
19610 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
19620 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
19630 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19640 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
19650 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
19660 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
19670 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
19680 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
19690 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
196a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
196b0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
196c0 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
196d0 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
196e0 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
196f0 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
19700 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
19710 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
19720 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
19730 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
19740 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
19750 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
19760 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
19770 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c  level, int bFull
19780 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  Fsync){.  pPager
19790 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
197a0 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
197b0 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
197c0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
197d0 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
197e0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
197f0 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
19800 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
19810 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53   = (bFullFsync?S
19820 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
19830 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
19840 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  AL);.  if( pPage
19850 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
19860 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
19870 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
19880 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19890 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
198a0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
198b0 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
198c0 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
198d0 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
198e0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
198f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
19900 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
19910 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
19920 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
19930 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
19940 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
19950 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
19960 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
19970 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
19980 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
19990 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
199a0 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
199b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
199c0 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
199d0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
199e0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
199f0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
19a00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
19a10 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
19a20 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
19a30 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
19a40 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
19a50 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
19a60 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
19a70 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
19a80 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
19a90 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
19aa0 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
19ab0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
19ac0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
19ad0 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
19ae0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
19af0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
19b00 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
19b10 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
19b20 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
19b30 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
19b40 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
19b50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
19b60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
19b70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
19b80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
19b90 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
19ba0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
19bb0 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
19bc0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
19bd0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
19be0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
19bf0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
19c00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
19c10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
19c20 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
19c30 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
19c40 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
19c50 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
19c60 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
19c70 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
19c80 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
19c90 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
19ca0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
19cb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
19cc0 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
19cd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
19ce0 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
19cf0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
19d00 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
19d10 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
19d20 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
19d30 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
19d40 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
19d50 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
19d60 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
19d70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19d80 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
19d90 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
19da0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
19db0 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
19dc0 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
19dd0 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
19de0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
19df0 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
19e00 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
19e10 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
19e20 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
19e30 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
19e40 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
19e50 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
19e60 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
19e70 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
19e80 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
19e90 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
19ea0 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
19eb0 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
19ec0 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
19ed0 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
19ee0 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
19ef0 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
19f00 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
19f10 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
19f20 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
19f30 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
19f60 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
19f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19fa0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
19fb0 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
19fc0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
19fd0 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
19fe0 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
19ff0 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
1a000 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
1a010 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
1a020 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
1a030 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
1a040 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
1a050 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
1a060 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
1a070 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
1a080 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
1a090 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
1a0a0 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
1a0b0 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
1a0c0 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
1a0d0 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
1a0e0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1a0f0 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
1a100 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
1a110 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1a120 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
1a130 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
1a140 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1a150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1a160 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
1a170 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
1a180 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
1a190 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1a1a0 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
1a1b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
1a1c0 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
1a1d0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
1a1e0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
1a1f0 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
1a200 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20  andler */.){  . 
1a210 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
1a220 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
1a230 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
1a240 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
1a250 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
1a260 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  g;.}../*.** Repo
1a270 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
1a280 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
1a290 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
1a2a0 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
1a2b0 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
1a2c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
1a2d0 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
1a2e0 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
1a2f0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1a300 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1a310 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
1a320 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
1a330 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
1a340 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
1a350 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1a380 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
1a390 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
1a3a0 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
1a3b0 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
1a3c0 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
1a3d0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
1a3e0 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
1a3f0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1a400 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20   page size used 
1a410 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  by the Pager obj
1a420 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67  ect. The new pag
1a430 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61  e size .** is pa
1a440 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69  ssed in *pPageSi
1a450 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
1a460 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
1a470 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
1a480 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1a490 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a  is called, it.**
1a4a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65   is a no-op. The
1a4b0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a4c0 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  is the error sta
1a4d0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  te error code (i
1a4e0 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53  .e. .** one of S
1a4f0 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
1a500 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53  ITE_CORRUPT or S
1a510 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
1a520 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1a530 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1a540 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1a550 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
1a560 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
1a570 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
1a580 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
1a590 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
1a5a0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
1a5b0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
1a5c0 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
1a5d0 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
1a5e0 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
1a5f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1a600 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
1a610 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
1a620 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
1a630 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
1a640 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
1a650 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
1a660 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1a670 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
1a680 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
1a690 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
1a6a0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
1a6b0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
1a6c0 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
1a6d0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
1a6e0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
1a6f0 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
1a700 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
1a710 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
1a720 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
1a730 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
1a740 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
1a750 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
1a760 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
1a770 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
1a780 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
1a790 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
1a7a0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
1a7b0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
1a7c0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
1a7d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1a7e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1a7f0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
1a800 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
1a810 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
1a820 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
1a830 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
1a840 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
1a850 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
1a860 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
1a870 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
1a880 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
1a890 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
1a8a0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1a8b0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
1a8c0 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
1a8d0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
1a8e0 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
1a8f0 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
1a900 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1a910 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1a920 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
1a930 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
1a940 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
1a950 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
1a960 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1a970 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  Code;..  if( rc=
1a980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a990 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
1a9a0 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20   *pPageSize;.   
1a9b0 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
1a9c0 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
1a9d0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
1a9e0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
1a9f0 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20  AGE_SIZE) );.   
1aa00 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65   if( (pPager->me
1aa10 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
1aa20 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
1aa30 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
1aa40 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
1aa50 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
1aa60 20 20 20 20 20 26 26 20 70 61 67 65 53 69 7a 65       && pageSize
1aa70 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
1aa80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
1aa90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
1aaa0 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
1aab0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
1aac0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
1aad0 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
1aae0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1aaf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1ab00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ab10 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1ab20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
1ab30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ab40 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
1ab50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
1ab60 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
1ab70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
1ab80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ab90 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
1aba0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
1abb0 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
1abc0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
1abd0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
1abe0 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53     }.    *pPageS
1abf0 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65  ize = (u16)pPage
1ac00 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1ac10 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
1ac20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61  ) nReserve = pPa
1ac30 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  ger->nReserve;. 
1ac40 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65     assert( nRese
1ac50 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
1ac60 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70  ve<1000 );.    p
1ac70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
1ac80 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b  = (i16)nReserve;
1ac90 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
1aca0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1acb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1acc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1acd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1ace0 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
1acf0 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
1ad00 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
1ad10 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
1ad20 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
1ad30 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
1ad40 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
1ad50 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
1ad60 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
1ad70 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
1ad80 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
1ad90 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
1ada0 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
1adb0 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
1adc0 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
1add0 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
1ade0 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
1adf0 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
1ae00 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
1ae10 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
1ae20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
1ae30 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
1ae40 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
1ae50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1ae60 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
1ae70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
1ae80 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
1ae90 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
1aea0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
1aeb0 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
1aec0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
1aed0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
1aee0 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
1aef0 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
1af00 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
1af10 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
1af20 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
1af30 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
1af40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
1af50 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
1af60 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
1af70 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
1af80 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
1af90 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1afa0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
1afb0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1afc0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
1afd0 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 69 66   int nPage;.  if
1afe0 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
1aff0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
1b000 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
1b010 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1b020 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1b030 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
1b040 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1b050 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1b060 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b070 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61 67 65  r->mxPgno>=nPage
1b080 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
1b090 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
1b0a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1b0b0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
1b0c0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
1b0d0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
1b0e0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
1b0f0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
1b100 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
1b110 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
1b120 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
1b130 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
1b140 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
1b150 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
1b160 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
1b170 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
1b180 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
1b190 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
1b1a0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
1b1b0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
1b1c0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1b1d0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
1b1e0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
1b1f0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
1b200 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
1b210 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
1b220 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
1b230 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
1b240 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1b250 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
1b260 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
1b270 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b280 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
1b290 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
1b2a0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
1b2b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
1b2c0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
1b2d0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
1b2e0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
1b2f0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
1b300 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
1b310 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1b320 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
1b330 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
1b340 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
1b350 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
1b360 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
1b370 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
1b380 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
1b390 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
1b3a0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
1b3b0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
1b3c0 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
1b3d0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
1b3e0 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
1b3f0 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
1b400 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
1b410 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
1b420 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
1b430 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
1b440 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
1b450 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1b460 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
1b470 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
1b480 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1b490 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
1b4a0 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
1b4b0 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
1b4c0 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
1b4d0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
1b4e0 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
1b4f0 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
1b500 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
1b510 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
1b520 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
1b530 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
1b540 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
1b550 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
1b560 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1b570 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1b580 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
1b590 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
1b5a0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
1b5b0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
1b5c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
1b5d0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
1b5e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
1b5f0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1b600 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
1b610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b620 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
1b630 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
1b640 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1b650 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1b660 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28  mpFile );..  if(
1b670 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1b680 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ger) ){.    int 
1b690 69 73 49 6e 57 61 6c 20 3d 20 30 3b 0a 20 20 20  isInWal = 0;.   
1b6a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1b6b0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61  Read(pPager->pWa
1b6c0 6c 2c 20 31 2c 20 26 69 73 49 6e 57 61 6c 2c 20  l, 1, &isInWal, 
1b6d0 4e 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 69  N, pDest);.    i
1b6e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b6f0 20 7c 7c 20 69 73 49 6e 57 61 6c 20 29 7b 0a 20   || isInWal ){. 
1b700 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b710 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1b720 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1b730 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
1b740 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
1b750 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
1b760 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
1b770 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1b780 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
1b790 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
1b7a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1b7b0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1b7c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b7d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b7e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b7f0 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
1b800 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
1b810 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1b820 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
1b830 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65  d .** with pPage
1b840 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  r. Normally, thi
1b850 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  s is calculated 
1b860 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a  as (<db file siz
1b870 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e  e>/<page-size>).
1b880 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
1b890 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
1b8a0 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
1b8b0 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
1b8c0 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
1b8d0 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
1b8e0 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
1b8f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
1b900 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73  er is in error s
1b910 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
1b920 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1b930 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65  d, then the.** e
1b940 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
1b950 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b960 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65  d and *pnPage le
1b970 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72  ft unchanged. Or
1b980 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65  ,.** if the file
1b990 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62   system has to b
1b9a0 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74 68  e queried for th
1b9b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1b9c0 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75  le and.** the qu
1b9d0 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74 75  ery attempt retu
1b9e0 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c  rns an IO error,
1b9f0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
1ba00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
1ba10 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  * and *pnPage is
1ba20 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
1ba30 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1ba40 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
1ba50 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  is successful, t
1ba60 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
1ba70 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
1ba80 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74 20   *pnPage is set 
1ba90 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1baa0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1bab0 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
1bac0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1bad0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
1bae0 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
1baf0 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d  {.  Pgno nPage =
1bb00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1bb10 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1bb20 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1bb30 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
1bb40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1bb50 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  ges in the file.
1bb60 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e   Store this in n
1bb70 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  Page. */.  if( p
1bb80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
1bb90 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  id ){.    nPage 
1bba0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1bbb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1bbc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1bbd0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
1bbe0 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69  returned by OsFi
1bbf0 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20  leSize() */.    
1bc00 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
1bc10 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1bc20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65  size in bytes re
1bc30 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1bc40 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69  Size() */..    i
1bc50 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
1bc60 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
1bc70 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1bc80 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73  NLOCK ){.      s
1bc90 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28  qlite3WalDbsize(
1bca0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e  pPager->pWal, &n
1bcb0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Page);.    }..  
1bcc0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1bcd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bce0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1bcf0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
1bd00 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
1bd10 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1bd20 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
1bd30 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1bd40 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
1bd50 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1bd60 3e 66 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20  >fd, &n)) ){.   
1bd70 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
1bd80 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1bd90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1bda0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1bdb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1bdc0 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
1bdd0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
1bde0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b        nPage = 1;
1bdf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1be00 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50        nPage = (P
1be10 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d  gno)(n / pPager-
1be20 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1be30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1be40 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1be50 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1be60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1be70 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
1be80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
1be90 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
1bea0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1beb0 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a  bSizeValid = 1;.
1bec0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1bed0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1bee0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1bef0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1bf00 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a  eater than the .
1bf10 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20    ** configured 
1bf20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75  maximum pager nu
1bf30 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74  mber, increase t
1bf40 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74  he allowed limit
1bf50 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1bf60 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65  e file can be re
1bf70 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ad..  */.  if( n
1bf80 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50  Page>pPager->mxP
1bf90 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1bfa0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e  r->mxPgno = (Pgn
1bfb0 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  o)nPage;.  }..  
1bfc0 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
1bfd0 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72  t variable and r
1bfe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1bff0 2a 2f 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  */.  *pnPage = n
1c000 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1c010 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1c020 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
1c030 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
1c040 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
1c050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c060 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
1c070 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
1c080 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
1c090 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1c0a0 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
1c0b0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
1c0c0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
1c0d0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1c0e0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
1c0f0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
1c100 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
1c110 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
1c120 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
1c130 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
1c140 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
1c150 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
1c160 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
1c170 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
1c180 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
1c190 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
1c1a0 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
1c1b0 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
1c1c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1c1d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1c1e0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1c1f0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
1c200 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
1c210 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
1c220 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
1c230 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
1c240 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
1c250 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
1c260 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
1c270 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1c280 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
1c290 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
1c2a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
1c2b0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
1c2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c2e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1c2f0 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
1c300 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
1c310 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1c320 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
1c330 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
1c340 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
1c350 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1c360 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
1c370 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
1c380 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
1c390 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
1c3a0 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
1c3b0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
1c3c0 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
1c3d0 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
1c3e0 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
1c3f0 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a   be unknown. It.
1c400 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61    ** must not ha
1c410 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
1c420 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
1c430 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1c440 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1c450 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
1c460 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1c470 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d==0 );.  assert
1c480 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1c490 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
1c4a0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
1c4b0 69 65 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ied==0 );..  /* 
1c4c0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
1c4d0 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
1c4e0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
1c4f0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
1c500 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
1c510 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
1c520 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
1c530 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
1c540 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
1c550 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
1c560 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
1c570 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
1c580 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
1c590 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
1c5a0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
1c5b0 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
1c5c0 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  e>=locktype).   
1c5d0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1c5e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1c5f0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
1c600 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
1c610 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
1c620 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
1c630 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74  ESERVED && lockt
1c640 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55  ype==PAGER_EXCLU
1c650 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66  SIVE).  );..  if
1c660 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1c670 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
1c680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
1c6a0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
1c6b0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1c6c0 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
1c6d0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
1c6e0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
1c6f0 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
1c700 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
1c710 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
1c720 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1c730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c740 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1c750 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a  = (u8)locktype;.
1c760 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1c770 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
1c780 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
1c790 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
1c7a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c7b0 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72  * Function asser
1c7c0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
1c7d0 69 6e 74 28 70 50 61 67 65 72 29 20 63 68 65 63  int(pPager) chec
1c7e0 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ks that one of t
1c7f0 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  he .** following
1c800 20 69 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c   is true for all
1c810 20 64 69 72 74 79 20 70 61 67 65 73 20 63 75 72   dirty pages cur
1c820 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
1c830 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20  ge-cache:.**.** 
1c840 20 20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75    a) The page nu
1c850 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
1c860 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1c870 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
1c880 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74 20 64  *      current d
1c890 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
1c8a0 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a  n pages, OR.**.*
1c8b0 2a 20 20 20 62 29 20 69 66 20 74 68 65 20 70 61  *   b) if the pa
1c8c0 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20  ge content were 
1c8d0 77 72 69 74 74 65 6e 20 61 74 20 74 68 69 73 20  written at this 
1c8e0 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  time, it would n
1c8f0 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65  ot.**      be ne
1c900 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
1c910 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
1c920 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20  tent out to the 
1c930 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  sub-journal.**  
1c940 20 20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e      (as determin
1c950 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73  ed by function s
1c960 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1c970 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ))..**.** If the
1c980 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72   condition asser
1c990 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
1c9a0 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
1c9b0 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64  ue, and the.** d
1c9c0 69 72 74 79 20 70 61 67 65 20 77 65 72 65 20 74  irty page were t
1c9d0 6f 20 62 65 20 64 69 73 63 61 72 64 65 64 20 66  o be discarded f
1c9e0 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 76 69  rom the cache vi
1c9f0 61 20 74 68 65 20 70 61 67 65 72 53 74 72 65 73  a the pagerStres
1ca00 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  s().** routine, 
1ca10 70 61 67 65 72 53 74 72 65 73 73 28 29 20 77 6f  pagerStress() wo
1ca20 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68  uld not write th
1ca30 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
1ca40 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65  ontent to.** the
1ca50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1ca60 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74  If a savepoint t
1ca70 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20  ransaction were 
1ca80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65  rolled back afte
1ca90 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e  r.** this happen
1caa0 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20  ed, the correct 
1cab0 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20  behaviour would 
1cac0 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  be to restore th
1cad0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e  e current.** con
1cae0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1caf0 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  . However, since
1cb00 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73   this content is
1cb10 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
1cb20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61  either.** the da
1cb30 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74  tabase file or t
1cb40 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  he portion of th
1cb50 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1cb60 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a  al and .** sub-j
1cb70 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61  ournal rolled ba
1cb80 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  ck the content c
1cb90 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74  ould not be rest
1cba0 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ored and the.** 
1cbb0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77  database image w
1cbc0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
1cbd0 75 70 74 2e 20 49 74 20 69 73 20 74 68 65 72 65  upt. It is there
1cbe0 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74  fore fortunate t
1cbf0 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72  hat .** this cir
1cc00 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74  cumstance cannot
1cc10 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64   arise..*/.#if d
1cc20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1cc30 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64  BUG).static void
1cc40 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1cc50 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67 48 64  onstraintCb(PgHd
1cc60 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  r *pPg){.  asser
1cc70 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
1cc80 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61  HDR_DIRTY );.  a
1cc90 73 73 65 72 74 28 20 21 73 75 62 6a 52 65 71 75  ssert( !subjRequ
1cca0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c  iresPage(pPg) ||
1ccb0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d   pPg->pgno<=pPg-
1ccc0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
1ccd0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1cce0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1ccf0 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65 72 20  onstraint(Pager 
1cd00 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
1cd10 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65  te3PcacheIterate
1cd20 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
1cd30 43 61 63 68 65 2c 20 61 73 73 65 72 74 54 72 75  Cache, assertTru
1cd40 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
1cd50 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  b);.}.#else.# de
1cd60 66 69 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63  fine assertTrunc
1cd70 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
1cd80 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ager).#endif../*
1cd90 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
1cda0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1cdb0 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74  ase file image t
1cdc0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54  o nPage pages. T
1cdd0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1cde0 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
1cdf0 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61  ly modify the da
1ce00 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
1ce10 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74  isk. It .** just
1ce20 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e   sets the intern
1ce30 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
1ce40 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20  pager object so 
1ce50 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75  that the .** tru
1ce60 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ncation will be 
1ce70 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75  done when the cu
1ce80 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1ce90 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
1cea0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1ceb0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1cec0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1ced0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
1cee0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cef0 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20  dbSizeValid );. 
1cf00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cf10 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29  >dbSize>=nPage )
1cf20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1cf30 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1cf40 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70  _RESERVED );.  p
1cf50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1cf60 6e 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54  nPage;.  assertT
1cf70 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1cf80 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  t(pPager);.}.../
1cf90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cfa0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
1cfb0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
1cfc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1cfd0 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e  lback. It.** syn
1cfe0 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
1cff0 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65  ile to disk, the
1d000 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a  n sets pPager->j
1d010 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65  ournalHdr to the
1d020 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
1d030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20  journal file so 
1d040 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70  that the pager_p
1d050 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
1d060 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20  e knows.** that 
1d070 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
1d080 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
1d090 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53   synced..**.** S
1d0a0 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  yncing a hot-jou
1d0b0 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66  rnal to disk bef
1d0c0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
1d0d0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65  o roll it back e
1d0e0 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20  nsures .** that 
1d0f0 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75  if a power-failu
1d100 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  re occurs during
1d110 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74   the rollback, t
1d120 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a  he process that.
1d130 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c  ** attempts roll
1d140 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73  back following s
1d150 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73  ystem recovery s
1d160 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75  ees the same jou
1d170 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rnal.** content 
1d180 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  as this process.
1d190 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
1d1a0 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61  hing goes as pla
1d1b0 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  nned, SQLITE_OK 
1d1c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1d1d0 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53  erwise, .** an S
1d1e0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1d1f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d200 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
1d210 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1d220 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1d230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1d240 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
1d250 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1d260 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1d270 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
1d280 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a  NC_NORMAL);.  }.
1d290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1d2b0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1d2c0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1d2d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d2e0 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dr);.  }.  retur
1d2f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1d300 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
1d310 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
1d320 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
1d330 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
1d340 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
1d350 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
1d360 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
1d370 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1d380 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
1d390 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1d3a0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
1d3b0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
1d3c0 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
1d3d0 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
1d3e0 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
1d3f0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
1d400 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
1d410 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
1d420 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
1d430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1d440 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
1d450 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
1d460 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
1d470 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
1d480 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
1d490 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1d4a0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
1d4b0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
1d4c0 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
1d4d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d4e0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
1d4f0 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
1d500 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
1d510 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
1d520 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
1d530 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1d540 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
1d550 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1d560 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
1d570 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38  r *pPager){.  u8
1d580 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70   *pTmp = (u8 *)p
1d590 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1d5a0 3b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  ;..  disable_sim
1d5b0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
1d5c0 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
1d5d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
1d5e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
1d5f0 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
1d600 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1d610 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
1d620 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1d630 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
1d640 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
1d650 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 28  ager->fd, .    (
1d660 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
1d670 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e   0 : pPager->syn
1d680 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20 70  c_flags), .    p
1d690 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1d6a0 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50 61   pTmp.  );.  pPa
1d6b0 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
1d6c0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
1d6d0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
1d6e0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1d6f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
1d700 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
1d710 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e     /* Set Pager.
1d720 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31  journalHdr to -1
1d730 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74   for the benefit
1d740 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c   of the pager_pl
1d750 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a  ayback() .    **
1d760 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20   call which may 
1d770 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74  be made from wit
1d780 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  hin pagerUnlockA
1d790 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66  ndRollback(). If
1d7a0 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
1d7b0 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75  t -1, then the u
1d7c0 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
1d7d0 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  of an open journ
1d7e0 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20  al file may.    
1d7f0 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ** be played bac
1d800 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
1d810 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
1d820 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
1d830 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
1d840 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
1d850 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d860 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
1d870 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
1d880 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1d890 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  d) ){.      pPag
1d8a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 61  er->errCode = pa
1d8b0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1d8c0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
1d8d0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
1d8e0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
1d8f0 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
1d900 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
1d910 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
1d920 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
1d930 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
1d940 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
1d950 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d960 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
1d970 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
1d980 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
1d990 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1d9a0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
1d9b0 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
1d9c0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
1d9d0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1d9e0 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
1d9f0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
1da00 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1da10 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
1da20 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
1da30 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
1da40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
1da50 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
1da60 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
1da70 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
1da80 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
1da90 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
1daa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1dab0 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
1dac0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1dad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dae0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
1daf0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
1db00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1db10 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1db20 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1db30 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1db40 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
1db50 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
1db60 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1db70 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
1db80 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1db90 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
1dba0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1dbb0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
1dbc0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1dbd0 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
1dbe0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1dbf0 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
1dc00 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
1dc10 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
1dc20 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
1dc30 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
1dc40 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
1dc50 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1dc60 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
1dc70 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
1dc80 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
1dc90 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
1dca0 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
1dcb0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
1dcc0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1dcd0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1dce0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1dcf0 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
1dd00 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1dd10 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
1dd20 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1dd30 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
1dd40 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
1dd50 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a   journal-mode.**
1dd60 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20   and the device 
1dd70 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1dd80 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
1dd90 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
1dda0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
1ddb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ddc0 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
1ddd0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
1dde0 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
1ddf0 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
1de00 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
1de10 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
1de20 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
1de30 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
1de40 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
1de50 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
1de60 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1de70 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1de80 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1de90 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
1dea0 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
1deb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1dec0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
1ded0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
1dee0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
1def0 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
1df00 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
1df10 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
1df20 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
1df30 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1df40 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
1df50 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
1df60 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
1df70 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
1df80 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1df90 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
1dfa0 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
1dfb0 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
1dfc0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1dfd0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
1dfe0 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
1dff0 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
1e000 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e010 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
1e020 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
1e030 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
1e040 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
1e050 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
1e060 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1e070 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
1e080 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
1e090 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
1e0a0 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
1e0b0 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1e0c0 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
1e0d0 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64  * The Pager.need
1e0e0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76  Sync flag is nev
1e0f0 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65  er be set for te
1e100 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f  mporary files, o
1e110 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70  r any.** file op
1e120 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  erating in no-sy
1e130 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e  nc mode (Pager.n
1e140 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e  oSync set to non
1e150 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  -zero)..**.** If
1e160 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
1e170 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
1e180 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1e190 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
1e1a0 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
1e1b0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
1e1c0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
1e1d0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
1e1e0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
1e1f0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e200 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
1e210 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e220 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e230 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1e240 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
1e250 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
1e270 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  dSync ){.    ass
1e280 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1e290 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1e2a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1e2b0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1e2c0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1e2d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e300 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e310 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
1e320 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1e330 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1e340 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1e350 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e360 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1e370 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
1e380 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1e390 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1e3a0 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1e3b0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
1e3c0 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
1e3d0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
1e3e0 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
1e3f0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
1e400 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
1e410 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
1e420 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
1e430 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
1e440 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
1e450 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1e460 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
1e470 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
1e480 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
1e490 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1e4a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
1e4b0 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
1e4c0 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
1e4d0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1e4e0 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
1e4f0 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1e500 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
1e510 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
1e520 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
1e530 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
1e540 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1e550 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1e560 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1e570 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1e580 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1e590 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1e5a0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1e5b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1e5c0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1e5d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1e5e0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1e5f0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1e600 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1e610 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1e620 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1e630 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1e640 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1e650 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1e660 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1e670 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1e680 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1e690 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1e6a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1e6b0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1e6c0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1e6d0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1e6e0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1e6f0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1e700 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1e710 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1e720 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e730 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1e740 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1e750 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1e760 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1e770 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1e780 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1e790 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1e7a0 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1e7b0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1e7c0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1e7d0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1e7e0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1e7f0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1e800 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1e810 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1e820 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1e830 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1e840 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1e850 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1e860 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1e870 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1e880 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1e890 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1e8a0 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1e8b0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1e8c0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1e8d0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1e8e0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1e8f0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1e900 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1e910 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1e920 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1e930 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1e940 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
1e950 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
1e960 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1e970 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
1e980 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
1e990 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
1e9a0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1e9b0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
1e9c0 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1e9d0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1e9e0 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1e9f0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1ea00 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1ea10 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1ea20 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1ea30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ea40 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1ea50 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1ea60 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1ea70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1ea80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1ea90 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1eaa0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1eab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1eac0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1ead0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1eae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1eaf0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1eb00 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1eb10 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1eb20 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1eb30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1eb40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1eb50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1eb60 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1eb70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1eb80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1eb90 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1eba0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1ebb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ebc0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1ebd0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1ebe0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1ebf0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1ec00 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1ec10 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1ec20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1ec30 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1ec40 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1ec50 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1ec60 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1ec70 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1ec80 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1ec90 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1eca0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1ecb0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1ecc0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1ecd0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1ece0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1ecf0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1ed00 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1ed10 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1ed20 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1ed30 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1ed40 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1ed50 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1ed60 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1ed70 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1ed80 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1ed90 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1eda0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1edb0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1edc0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1edd0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1ede0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1edf0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1ee00 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1ee10 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1ee20 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1ee30 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1ee40 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1ee50 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1ee60 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1ee70 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1ee80 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1ee90 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1eea0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1eeb0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1eec0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1eed0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1eee0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1eef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1ef00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1ef10 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1ef20 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1ef30 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1ef40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1ef50 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1ef60 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1ef70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1ef80 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1ef90 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1efa0 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1efb0 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
1efc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1efd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1efe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1eff0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1f000 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1f010 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1f020 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f030 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1f040 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1f050 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1f060 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f070 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1f080 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1f090 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1f0a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1f0b0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f0c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1f0d0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f0e0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1f0f0 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1f100 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1f110 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1f120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f130 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f140 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f150 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1f160 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1f170 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1f180 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1f190 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1f1a0 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1f1b0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1f1c0 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1f1d0 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1f1e0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1f1f0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1f200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1f210 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ed = 1;.    pPag
1f220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1f230 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f240 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Off;.    sqlite3
1f250 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
1f260 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
1f270 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ache);.  }..  re
1f280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f290 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
1f2a0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
1f2b0 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
1f2c0 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1f2d0 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
1f2e0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
1f2f0 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
1f300 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
1f310 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
1f320 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
1f330 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
1f340 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1f350 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
1f360 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
1f370 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
1f380 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
1f390 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
1f3a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
1f3b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1f3c0 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
1f3d0 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
1f3e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
1f3f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
1f400 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
1f410 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
1f420 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
1f430 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
1f440 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
1f450 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
1f460 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
1f470 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
1f480 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
1f490 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1f4a0 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
1f4b0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1f4c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f4d0 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
1f4e0 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
1f4f0 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
1f500 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
1f510 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
1f520 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
1f530 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
1f540 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
1f550 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
1f560 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
1f570 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
1f580 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
1f590 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
1f5a0 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
1f5b0 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
1f5c0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
1f5d0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1f5e0 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
1f5f0 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
1f600 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
1f610 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
1f620 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
1f630 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
1f640 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
1f650 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1f660 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
1f670 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
1f680 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
1f690 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
1f6a0 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
1f6b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
1f6c0 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
1f6d0 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
1f6e0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
1f6f0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1f700 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
1f710 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
1f720 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
1f730 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
1f740 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
1f750 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
1f760 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
1f770 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
1f780 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
1f790 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
1f7a0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1f7b0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1f7c0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1f7d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f7e0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1f7f0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
1f800 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1f810 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
1f820 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
1f830 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
1f840 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
1f850 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
1f860 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1f870 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
1f880 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
1f890 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
1f8a0 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f8c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1f8d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f900 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
1f910 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29   NEVER(pList==0)
1f920 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1f930 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
1f940 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
1f950 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
1f960 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
1f970 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
1f980 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
1f990 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
1f9a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1f9b0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
1f9c0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
1f9d0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
1f9e0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73  ing.  ** call is
1f9f0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
1fa00 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
1fa10 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
1fa20 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
1fa30 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
1fa40 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
1fa50 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
1fa60 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
1fa70 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
1fa80 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
1fa90 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
1faa0 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
1fab0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
1fac0 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
1fad0 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
1fae0 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
1faf0 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
1fb00 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
1fb10 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
1fb20 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
1fb30 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
1fb40 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
1fb50 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
1fb60 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
1fb70 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
1fb80 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
1fb90 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
1fba0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
1fbb0 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
1fbc0 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
1fbd0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
1fbe0 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
1fbf0 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
1fc00 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
1fc10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fc20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
1fc30 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
1fc40 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
1fc50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fc60 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
1fc70 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
1fc80 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
1fc90 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
1fca0 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
1fcb0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
1fcc0 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61  seWal(pList->pPa
1fcd0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
1fce0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1fcf0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1fd00 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
1fd10 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1fd20 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1fd30 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OCK);..  /* If t
1fd40 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
1fd50 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
1fd60 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
1fd70 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
1fd80 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
1fd90 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
1fda0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
1fdb0 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
1fdc0 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
1fdd0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
1fde0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
1fdf0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
1fe00 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
1fe10 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
1fe20 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
1fe30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
1fe40 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
1fe50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
1fe60 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
1fe70 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
1fe80 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
1fe90 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
1fea0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1feb0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
1fec0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
1fed0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
1fee0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1fef0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
1ff00 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1ff10 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
1ff20 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
1ff30 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
1ff40 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
1ff50 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1ff60 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
1ff70 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
1ff80 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
1ff90 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
1ffa0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
1ffb0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
1ffc0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
1ffd0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
1ffe0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1fff0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
20000 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
20010 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
20020 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
20030 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
20040 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
20050 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
20060 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
20070 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
20080 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
20090 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
200a0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
200b0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
200c0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
200d0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
200e0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
200f0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
20100 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
20110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20130 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
20140 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
20150 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
20160 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20170 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
20180 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
20190 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
201a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
201b0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
201c0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
201d0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
201e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
201f0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
20200 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
20210 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
20220 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
20230 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
20240 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
20250 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
20260 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
20270 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
20280 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
20290 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
202a0 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
202b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
202c0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
202d0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
202e0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
202f0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
20300 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
20310 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20320 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
20330 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
20340 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
20350 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
20360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20370 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
20380 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
20390 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
203a0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
203b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
203c0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
203d0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
203e0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
203f0 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
20400 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
20410 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
20420 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
20430 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
20440 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
20450 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
20460 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
20470 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
20490 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
204a0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
204b0 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
204c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
204d0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
204e0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
204f0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
20500 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
20510 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
20520 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
20530 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
20540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20550 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
20560 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
20570 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20580 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
20590 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
205a0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
205b0 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
205c0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
205d0 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
205e0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
205f0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
20600 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20610 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
20620 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
20630 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
20640 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
20650 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20  ub-journal. .** 
20660 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
20670 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
20680 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75   to use subjRequ
20690 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68  iresPage() to ch
206a0 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20  eck .** that it 
206b0 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  is really requir
206c0 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
206d0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
206e0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
206f0 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
20700 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
20710 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
20720 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
20730 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
20740 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
20750 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
20760 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
20770 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
20780 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
20790 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
207a0 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
207b0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
207c0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
207d0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
207e0 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
207f0 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
20800 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
20810 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
20820 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
20830 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
20840 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
20850 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
20860 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20870 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
20880 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
20890 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  ger;.  if( isOpe
208a0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
208b0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  ){.    void *pDa
208c0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
208d0 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
208e0 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
208f0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
20900 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72  eSize);.    char
20910 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 43   *pData2;..    C
20920 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
20930 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
20940 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
20950 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
20960 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
20970 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
20980 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
20990 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
209a0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20  Pg->pgno));.  . 
209b0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
209c0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a  UseWal(pPager) .
209d0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65           || page
209e0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a  InJournal(pPg) .
209f0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d           || pPg-
20a00 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
20a10 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b  OrigSize .    );
20a20 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
20a30 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
20a40 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
20a50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
20a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20a70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20a80 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
20a90 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c  r->sjfd, pData2,
20aa0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20ab0 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
20ac0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
20ad0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20ae0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
20af0 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ec++;.    assert
20b00 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
20b10 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63  oint>0 );.    rc
20b20 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   = addToSavepoin
20b30 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
20b40 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d   pPg->pgno);.  }
20b50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20b60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20b70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
20b80 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
20b90 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
20ba0 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
20bb0 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
20bc0 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
20bd0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
20be0 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a  r to a Pager obj
20bf0 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20  ect.** (cast as 
20c00 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61  a void*). The pa
20c10 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70  ger is always 'p
20c20 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61  urgeable' (not a
20c30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64  n in-memory.** d
20c40 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65  atabase). The se
20c50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
20c60 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
20c70 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a  a page that is .
20c80 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72  ** currently dir
20c90 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75  ty but has no ou
20ca0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
20cb0 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a  nces. The page.*
20cc0 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f  * is always asso
20cd0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
20ce0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73  Pager object pas
20cf0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
20d00 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
20d10 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20  *.** The job of 
20d20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
20d30 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65   to make pPg cle
20d40 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74  an by writing it
20d50 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75  s contents.** ou
20d60 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
20d70 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69  e file, if possi
20d80 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e  ble. This may in
20d90 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68  volve syncing th
20da0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
20db0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  e. .**.** If suc
20dc0 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33  cessful, sqlite3
20dd0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
20de0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
20df0 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53  he page and.** S
20e00 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
20e10 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
20e20 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
20e30 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68  rying to make th
20e40 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c  e.** page clean,
20e50 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
20e60 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
20e70 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e  If the page cann
20e80 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c  ot be.** made cl
20e90 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ean for some oth
20ea0 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e  er reason, but n
20eb0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20ec0 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  then SQLITE_OK.*
20ed0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  * is returned by
20ee0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
20ef0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74  keClean() is not
20f00 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
20f10 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65  ic int pagerStre
20f20 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64  ss(void *p, PgHd
20f30 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
20f40 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
20f50 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20  r *)p;.  int rc 
20f60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20f70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
20f80 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
20f90 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
20fa0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
20fb0 29 3b 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  );..  pPg->pDirt
20fc0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
20fd0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20fe0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
20ff0 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
21000 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
21010 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
21020 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
21030 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20  sPage(pPg) ){ . 
21040 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
21050 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a  rnalPage(pPg); .
21060 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
21070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21080 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
21090 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
210a0 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a   pPg, 0, 0, 0);.
210b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
210c0 20 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53     /* The doNotS
210d0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
210e0 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  by the sqlite3Pa
210f0 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63 74  gerWrite() funct
21100 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 20  ion while it.   
21110 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69   ** is journalli
21120 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20  ng a set of two 
21130 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65  or more database
21140 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
21150 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 6f 6e  stored.    ** on
21160 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73   the same disk s
21170 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74  ector. Syncing t
21180 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
21190 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a  t allowed while.
211a0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
211b0 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
211c0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
211d0 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
211e0 73 75 63 68 20 61 0a 20 20 20 20 2a 2a 20 73 65  such a.    ** se
211f0 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73  t of pages are s
21200 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f  ynced to disk to
21210 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74  gether. So, if t
21220 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e  he page this fun
21230 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20  ction.    ** is 
21240 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63  trying to make c
21250 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72  lean will requir
21260 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  e a journal sync
21270 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79   and the doNotSy
21280 6e 63 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  nc.    ** flag i
21290 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
212a0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
212b0 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
212c0 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 20 20   layer will.    
212d0 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  ** just have to 
212e0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c  go ahead and all
212f0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
21300 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
21310 6f 66 0a 20 20 20 20 2a 2a 20 72 65 75 73 69 6e  of.    ** reusin
21320 67 20 70 50 67 2e 0a 20 20 20 20 2a 2a 0a 20 20  g pPg..    **.  
21330 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
21340 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  if the pager has
21350 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
21360 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
21370 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  , do not.    ** 
21380 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
21390 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
213a0 20 74 6f 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   to disk..    */
213b0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
213c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 0a  Pager->errCode).
213d0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
213e0 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
213f0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
21400 45 45 44 5f 53 59 4e 43 29 0a 20 20 20 20 29 7b  EED_SYNC).    ){
21410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
21430 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
21440 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
21450 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
21460 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
21470 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
21480 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  C ){.      rc = 
21490 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
214a0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
214b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
214c0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
214d0 20 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70   && .        !(p
214e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
214f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
21500 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26  LMODE_MEMORY) &&
21510 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74  .        !(sqlit
21520 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
21530 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
21540 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
21550 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a  AP_SAFE_APPEND).
21560 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
21570 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
21580 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
21590 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
215a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
215b0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
215c0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
215d0 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65  ber of this page
215e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
215f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
21600 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   of.    ** the d
21610 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
21620 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
21630 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
21640 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  sub-journal..   
21650 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
21660 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
21670 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
21680 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
21690 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74  l not.    ** act
216a0 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61  ually write data
216b0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20   to the file in 
216c0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a  this case..    *
216d0 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65  *.    ** Conside
216e0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
216f0 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e  sequence of even
21700 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ts:.    **.    *
21710 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a  *   BEGIN;.    *
21720 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
21730 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20  age X>.    **   
21740 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
21750 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56  >.    **     SAV
21760 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a  EPOINT sp;.    *
21770 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20  *       <shrink 
21780 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
21790 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a   Y pages>.    **
217a0 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
217b0 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a  ss(page X).    *
217c0 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
217d0 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  O sp;.    **.   
217e0 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68   ** If (X>Y), th
217f0 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72  en when pagerStr
21800 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61  ess is called pa
21810 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ge X will not be
21820 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20   written.    ** 
21830 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
21840 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69  ase file, but wi
21850 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
21860 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68  om the cache. Th
21870 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  en,.    ** follo
21880 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
21890 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
218a0 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
218b0 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
218c0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
218d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
218e0 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
218f0 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
21900 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77  X as it.    ** w
21910 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  as when the tran
21920 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
21930 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77   not as it was w
21940 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73  hen "SAVEPOINT s
21950 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78  p".    ** was ex
21960 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  ecuted..    **. 
21970 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69     ** The soluti
21980 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
21990 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
219a0 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
219b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
219c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77  journal file now
219d0 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
219e0 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73  lready there), s
219f0 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20  o that it will. 
21a00 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65     ** be restore
21a10 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  d to its current
21a20 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20   value when the 
21a30 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
21a40 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63   is .    ** exec
21a50 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uted..    */.   
21a60 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20   if( NEVER(.    
21a70 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
21a80 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
21a90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
21aa0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
21ab0 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a  e(pPg).    ) ){.
21ac0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
21ad0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
21ae0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
21af0 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
21b00 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
21b10 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
21b20 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
21b30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21b40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
21b50 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
21b60 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
21b70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
21b80 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
21b90 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  n. */.  if( rc==
21ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21bb0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
21bc0 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
21bd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21be0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
21bf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
21c00 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
21c10 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
21c20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
21c30 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a  ger, rc);.}.../*
21c40 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
21c50 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
21c60 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
21c70 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
21c80 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
21c90 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
21ca0 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
21cb0 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
21cc0 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
21cd0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
21ce0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
21cf0 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
21d00 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
21d10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21d20 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
21d30 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
21d40 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
21d50 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
21d60 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
21d70 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
21d80 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
21d90 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
21da0 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
21db0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
21dc0 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
21dd0 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
21de0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
21df0 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
21e00 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
21e10 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
21e20 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
21e30 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
21e40 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
21e50 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
21e60 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
21e70 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
21e80 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
21e90 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
21ea0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
21eb0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
21ec0 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
21ed0 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
21ee0 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
21ef0 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
21f00 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
21f10 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
21f20 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
21f30 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
21f40 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
21f50 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
21f60 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
21f70 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
21f80 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
21f90 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
21fa0 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
21fb0 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
21fc0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
21fd0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
21fe0 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52  L and PAGER_NO_R
21ff0 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a  EADLOCK flags..*
22000 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67  *.** The vfsFlag
22010 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  s parameter is a
22020 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73   bitmask to pass
22030 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61   to the flags pa
22040 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
22050 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64  e xOpen() method
22060 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
22070 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e   VFS when openin
22080 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20  g files. .**.** 
22090 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  If the pager obj
220a0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
220b0 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69   and the specifi
220c0 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a  ed file opened .
220d0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ** successfully,
220e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
220f0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
22100 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ger set to point
22110 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70   to.** the new p
22120 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
22130 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
22140 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74   *ppPager is set
22150 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20   to NULL.** and 
22160 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72  error code retur
22170 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ned. This functi
22180 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
22190 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73  LITE_NOMEM.** (s
221a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69  qlite3Malloc() i
221b0 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
221c0 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49  te memory), SQLI
221d0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a  TE_CANTOPEN or .
221e0 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54  ** various SQLIT
221f0 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e  E_IO_XXX errors.
22200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22210 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69  agerOpen(.  sqli
22220 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
22230 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
22240 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ual file system 
22250 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65  to use */.  Page
22260 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
22270 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
22280 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
22290 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
222a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
222b0 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
222c0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
222d0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
222e0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22300 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
22310 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
22320 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
22330 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
22340 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
22350 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
22360 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
22370 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
22380 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
22390 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
223a0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
223b0 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28  en() */.  void (
223c0 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
223d0 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  *) /* Function t
223e0 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  o reinitialize p
223f0 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ages */.){.  u8 
22400 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
22410 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20  pPager = 0;     
22420 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
22430 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  t to allocate an
22440 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  d return */.  in
22450 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22460 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
22470 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74   code */.  int t
22480 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20  empFile = 0;    
22490 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
224a0 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c  temp files (incl
224b0 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  . in-memory file
224c0 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44  s) */.  int memD
224d0 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
224e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
224f0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
22500 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
22510 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  eadOnly = 0;    
22520 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
22530 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e  his is a read-on
22540 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ly file */.  int
22550 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
22560 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74  ;     /* Bytes t
22570 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65  o allocate for e
22580 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a  ach journal fd *
22590 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  /.  char *zPathn
225a0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
225b0 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74  Full path to dat
225c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
225d0 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20  int nPathname = 
225e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  0;       /* Numb
225f0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
22600 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  Pathname */.  in
22610 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
22620 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
22630 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20  IT_JOURNAL)==0; 
22640 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74  /* False to omit
22650 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
22660 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
22670 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
22680 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20  _READLOCK)!=0;  
22690 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
226a0 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69  read-lock */.  i
226b0 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
226c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
226d0 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
226e0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
226f0 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
22700 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u16 szPageDflt =
22710 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
22720 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
22730 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
22740 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
22750 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
22760 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
22770 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
22780 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
22790 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
227a0 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
227b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
227c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
227d0 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   This.  ** is th
227e0 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20  e maximum space 
227f0 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
22800 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
22810 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20  l file handle . 
22820 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61   ** and a regula
22830 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  r journal file-h
22840 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74  andle. Note that
22850 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72   a "regular jour
22860 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a  nal-handle".  **
22870 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65   may be a wrappe
22880 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63  r capable of cac
22890 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  hing the first p
228a0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  ortion of the jo
228b0 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
228c0 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70  in memory to imp
228d0 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69  lement the atomi
228e0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
228f0 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20  tion (see .  ** 
22900 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72  source file jour
22910 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69  nal.c)..  */.  i
22920 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  f( sqlite3Journa
22930 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69  lSize(pVfs)>sqli
22940 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
22950 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e  e() ){.    journ
22960 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
22970 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
22980 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20  alSize(pVfs));. 
22990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72   }else{.    jour
229a0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
229b0 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a  UND8(sqlite3MemJ
229c0 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20  ournalSize());. 
229d0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
229e0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
229f0 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
22a00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
22a10 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
22a20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
22a30 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
22a40 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
22a50 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
22a60 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
22a70 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
22a80 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
22a90 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
22aa0 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
22ab0 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
22ac0 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
22ad0 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
22ae0 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
22af0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
22b00 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
22b10 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
22b20 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
22b30 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
22b40 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
22b50 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
22b60 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
22b70 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
22b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22b90 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
22ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
22bb0 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
22bc0 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
22bd0 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
22be0 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
22bf0 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
22c00 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
22c10 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
22c20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  {.      zPathnam
22c30 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
22c40 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
22c50 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
22c60 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
22c70 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
22c80 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
22c90 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
22ca0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
22cb0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
22cc0 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  }..    nPathname
22cd0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
22ce0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
22cf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22d00 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
22d10 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
22d20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
22d30 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
22d40 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
22d50 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
22d60 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
22d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
22d80 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
22d90 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
22da0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
22db0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
22dc0 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
22dd0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
22de0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
22df0 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
22e00 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
22e10 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
22e20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
22e30 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
22e40 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
22e50 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
22e60 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
22e70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22e80 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
22e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22ec0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
22ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
22ef0 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
22f00 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
22f10 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
22f20 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
22f30 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
22f40 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
22f50 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
22f60 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
22f70 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
22f80 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
22f90 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
22fa0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
22fb0 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
22fe0 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
22ff0 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
23020 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
23030 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
23040 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
23050 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
23060 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
23070 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
23080 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
23090 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
230a0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
230b0 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
230c0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
230d0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
230e0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
230f0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
23100 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
23110 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
23120 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
23130 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
23140 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
23150 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
23160 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
23170 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
23180 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
23190 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
231a0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
231b0 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
231c0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
231d0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
231e0 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
231f0 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
23200 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
23210 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
23220 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
23230 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
23240 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
23250 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
23260 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
23270 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
23280 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
23290 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
232a0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
232b0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
232c0 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
232d0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
232e0 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
232f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
23300 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
23310 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
23320 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
23330 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
23340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
23350 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
23360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
23370 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
23380 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
23390 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
233a0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
233b0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
233c0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
233d0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
233e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
233f0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
23400 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
23410 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
23420 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
23430 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
23440 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
23450 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
23460 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
23470 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
23480 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
23490 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
234a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
234b0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
234c0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
234d0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
234e0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
234f0 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
23500 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
23510 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
23520 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
23530 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
23540 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
23550 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
23560 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
23570 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
23580 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
23590 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
235a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
235b0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
235c0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
235d0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
235e0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
235f0 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
23600 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
23610 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
23620 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
23630 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
23640 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
23650 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  r->zFilename[0]=
23660 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  =0 ) pPager->zJo
23670 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20  urnal[0] = 0;.  
23680 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23690 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
236a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
236b0 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
236c0 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
236d0 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
236e0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
236f0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
23700 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
23710 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
23720 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
23730 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23740 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
23750 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
23760 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
23770 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
23780 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
23790 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
237a0 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
237b0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61   &fout);.    rea
237c0 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
237d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
237e0 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
237f0 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
23800 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
23810 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
23820 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
23830 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
23840 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
23850 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
23860 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
23870 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
23880 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
23890 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
238a0 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
238b0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
238c0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
238d0 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
238e0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
238f0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
23900 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
23910 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
23920 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
23930 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
23940 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
23950 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
23960 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72  =SQLITE_OK && !r
23970 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
23980 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
23990 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
239a0 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
239b0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
239c0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
239d0 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
239e0 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
239f0 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
23a00 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
23a10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
23a20 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
23a30 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
23a40 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
23a50 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
23a60 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
23a70 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
23a80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23a90 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
23aa0 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
23ab0 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
23ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
23ad0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
23ae0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
23af0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
23b00 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
23b10 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
23b20 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
23b30 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  >fd);.        in
23b40 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73  t ii;.        as
23b50 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
23b60 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
23b70 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
23b80 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
23b90 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
23ba0 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
23bb0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
23bc0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
23bd0 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
23be0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
23bf0 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
23c00 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
23c10 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
23c20 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
23c30 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
23c40 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
23c50 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
23c60 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
23c70 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
23c80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23c90 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
23ca0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
23cb0 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
23cc0 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
23cd0 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
23ce0 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
23cf0 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
23d00 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
23d10 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
23d20 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
23d30 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
23d40 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
23d50 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
23d60 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
23d70 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
23d80 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
23d90 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
23da0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
23db0 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
23dc0 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
23dd0 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
23de0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
23df0 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
23e00 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
23e10 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
23e20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
23e30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
23e40 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
23e50 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
23e60 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
23e70 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
23e80 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
23e90 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
23ea0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
23eb0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
23ec0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
23ed0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
23ee0 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
23ef0 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
23f00 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
23f10 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
23f20 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
23f30 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
23f40 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
23f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
23f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
23f70 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
23f80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
23f90 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
23fa0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
23fb0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
23fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23fd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
23fe0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
23ff0 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
24000 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
24010 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20   free the .  ** 
24020 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
24030 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
24040 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
24050 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24060 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
24070 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
24080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  ;.    sqlite3OsC
24090 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
240a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
240b0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
240c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
240d0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
240e0 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
240f0 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
24100 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
24110 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38   nExtra = ROUND8
24120 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69  (nExtra);.  sqli
24130 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
24140 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
24150 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d                !m
24170 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73  emDb?pagerStress
24180 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  :0, (void *)pPag
24190 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61  er, pPager->pPCa
241a0 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  che);..  PAGERTR
241b0 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
241c0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
241d0 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
241e0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
241f0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
24200 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
24210 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
24220 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
24230 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
24240 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
24250 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
24260 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
24270 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
24280 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
24290 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
242a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
242b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
242c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
242d0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
242e0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
242f0 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
24300 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  b;.  /* pPager->
24310 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
24320 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
24330 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
24340 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
24350 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
24360 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
24370 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
24380 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
24390 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
243a0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73  UNLOCK; */.  ass
243b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
243c0 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20  te == (tempFile 
243d0 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ? PAGER_EXCLUSIV
243e0 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  E : PAGER_UNLOCK
243f0 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  ) );.  /* pPager
24400 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
24410 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
24420 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
24430 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
24440 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
24450 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
24460 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
24470 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
24480 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
24490 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
244a0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
244b0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
244c0 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
244d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
244e0 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
244f0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
24500 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
24510 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
24520 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
24530 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
24540 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
24550 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
24560 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
24570 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65  c = 0; */.  asse
24580 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
24590 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
245a0 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
245b0 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
245c0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
245d0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
245e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
245f0 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
24600 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
24610 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
24620 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
24630 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
24640 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
24650 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
24660 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
24670 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24680 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
24690 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
246a0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
246b0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
246c0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
246d0 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
246e0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
246f0 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
24700 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
24710 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
24720 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
24730 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
24740 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
24750 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
24760 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
24770 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
24780 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
24790 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
247a0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
247b0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
247c0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
247d0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
247e0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
247f0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
24800 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
24810 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
24820 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
24830 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
24840 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
24850 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
24860 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
24870 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
24880 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24890 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
248a0 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
248b0 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
248c0 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
248d0 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
248e0 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
248f0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
24900 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
24910 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
24920 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
24930 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
24940 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
24950 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
24960 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
24970 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
24980 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
24990 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
249a0 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
249b0 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
249c0 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
249d0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
249e0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
249f0 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
24a00 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
24a10 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
24a20 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
24a30 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
24a40 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
24a50 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
24a60 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
24a70 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
24a80 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
24a90 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
24aa0 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
24ab0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
24ac0 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
24ad0 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
24ae0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
24af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24b00 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
24b10 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
24b20 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
24b30 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
24b40 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
24b50 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
24b60 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
24b70 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
24b80 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
24b90 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
24ba0 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
24bb0 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
24bc0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
24bd0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
24be0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
24bf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
24c00 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
24c10 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
24c20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
24c30 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
24c40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
24c50 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
24c60 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
24c70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
24c80 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
24c90 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
24ca0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
24cb0 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
24cc0 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
24cd0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
24ce0 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
24cf0 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
24d00 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
24d10 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
24d20 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
24d30 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
24d40 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
24d50 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
24d60 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
24d70 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
24d80 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
24d90 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
24da0 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
24db0 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
24dc0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
24dd0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
24de0 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
24df0 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
24e00 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
24e10 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
24e20 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
24e30 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
24e40 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
24e50 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
24e60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
24e70 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
24e80 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
24e90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
24ea0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
24eb0 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
24ec0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24ed0 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
24ee0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24ef0 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
24f00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
24f10 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
24f20 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
24f30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24f40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
24f50 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
24f60 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20 20   exists;        
24f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
24f80 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
24f90 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
24fa0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
24fb0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
24fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
24fd0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
24fe0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
24ff0 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
25000 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
25010 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
25020 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
25030 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48  tate <= PAGER_SH
25040 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69  ARED );..  *pExi
25050 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  sts = 0;.  rc = 
25060 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
25070 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
25080 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
25090 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
250a0 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63  xists);.  if( rc
250b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
250c0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
250d0 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20   locked;        
250e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
250f0 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
25100 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
25110 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
25120 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
25130 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
25140 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
25150 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
25160 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
25170 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
25180 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
25190 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
251a0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
251b0 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
251c0 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
251d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
251e0 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
251f0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
25200 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
25210 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
25220 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
25230 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
25240 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
25250 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
25260 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
25270 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
25280 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
25290 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
252a0 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
252b0 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
252c0 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
252d0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
252e0 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
252f0 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
25300 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
25310 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
25320 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
25330 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
25340 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
25350 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
25360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
25370 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
25380 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  t nPage;..      
25390 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a  /* Check the siz
253a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
253b0 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f  e file. If it co
253c0 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67 65  nsists of 0 page
253d0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  s,.      ** then
253e0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
253f0 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68  nal file. See th
25400 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
25410 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20   above for .    
25420 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69    ** the reasoni
25430 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65  ng here.  Delete
25440 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f   the obsolete jo
25450 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72  urnal file under
25460 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45  .      ** a RESE
25470 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f  RVED lock to avo
25480 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  id race conditio
25490 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20  ns and to avoid 
254a0 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20  violating.      
254b0 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20  ** [H33020]..   
254c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
254d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
254e0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
254f0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
25500 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25510 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
25520 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
25530 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
25540 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
25550 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
25560 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
25570 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
25580 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
25590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
255a0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
255b0 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
255c0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
255d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
255e0 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
255f0 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
25600 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
25610 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25620 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
25630 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
25640 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
25650 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
25660 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
25670 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
25680 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
25690 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
256a0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
256b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
256c0 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
256d0 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
256e0 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
256f0 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
25700 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
25710 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
25720 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
25730 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
25740 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
25750 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
25760 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
25770 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
25780 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
25790 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
257a0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
257b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
257c0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
257d0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
257e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
257f0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
25800 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
25810 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
25820 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
25830 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25850 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
25860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
25870 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
25880 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
25890 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
258a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
258b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
258c0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
258d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
258e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
258f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
25900 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25910 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
25920 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
25930 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
25940 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
25950 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25960 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
25970 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
25980 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
25990 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
259a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
259b0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
259c0 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
259d0 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
259e0 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
259f0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
25a00 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
25a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
25a20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
25a30 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
25a40 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
25a50 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
25a60 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
25a70 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
25a80 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
25a90 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
25aa0 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
25ab0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
25ac0 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
25ad0 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
25ae0 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
25af0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
25b00 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
25b10 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
25b20 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
25b30 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
25b40 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
25b50 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
25b60 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
25b70 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
25b80 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
25b90 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
25ba0 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
25bb0 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
25bc0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
25bd0 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
25be0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25bf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
25c00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
25c10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25c20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25c30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25c40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
25c50 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
25c60 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
25c70 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
25c80 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
25c90 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
25ca0 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
25cb0 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
25cc0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
25cd0 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
25ce0 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
25cf0 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
25d00 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
25d10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25d20 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
25d30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
25d40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
25d50 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
25d60 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
25d70 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
25d80 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
25d90 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
25da0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
25db0 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
25dc0 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
25dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25de0 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
25df0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
25e00 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
25e10 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
25e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25e30 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
25e40 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
25e50 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
25e60 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
25e70 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
25e80 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
25e90 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
25ea0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
25eb0 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
25ec0 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
25ed0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
25ee0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
25ef0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
25f00 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
25f10 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
25f20 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
25f30 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
25f40 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
25f50 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
25f60 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
25f70 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
25f80 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
25f90 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
25fa0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
25fb0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
25fc0 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
25fd0 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
25fe0 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
25ff0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
26000 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
26010 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
26020 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
26030 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
26040 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
26050 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
26060 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
26070 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
26080 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
26090 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
260a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
260b0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
260c0 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
260d0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
260e0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
260f0 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  (2) above is not
26100 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20   attempted, and 
26110 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20  if the.** pager 
26120 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
26130 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
26140 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e  SQLITE_FULL when
26150 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
26160 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74  .** the error st
26170 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
26180 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  s returned. It i
26190 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72  s permitted to r
261a0 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ead the.** datab
261b0 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49  ase when in SQLI
261c0 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74  TE_FULL error st
261d0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ate..**.** Other
261e0 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
261f0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
26200 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
26210 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a  returned. If an.
26220 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  ** IO error occu
26230 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
26240 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
26250 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
26260 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
26270 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  e or rolling bac
26280 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
26290 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
262a0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
262b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
262c0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
262d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
262e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
262f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26300 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
26310 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72  de */.  int isEr
26320 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20  rorReset = 0;   
26330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
26340 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67  ue if recovering
26350 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74   from error stat
26360 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
26370 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
26380 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
26390 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
263a0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
263b0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
263c0 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ages */.  assert
263d0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
263e0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
263f0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
26400 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
26410 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
26420 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
26430 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
26440 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
26450 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 61  database is in a
26460 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e  n error-state, n
26470 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ow is a chance t
26480 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
26490 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
264a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
264b0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
264c0 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  and rollback.  *
264d0 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61  * any hot journa
264e0 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
264f0 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  stem..  */.  if(
26500 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26510 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   ){.    if( isOp
26520 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26530 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  || pPager->zJour
26540 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45  nal ){.      isE
26550 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
26560 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
26570 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
26580 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
26590 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
265a0 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
265b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
265c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
265d0 70 65 6e 53 6e 61 70 73 68 6f 74 28 70 50 61 67  penSnapshot(pPag
265e0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  er);.  }else if(
265f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
26600 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
26610 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
26620 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
26630 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
26640 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
26650 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61   int isHotJourna
26660 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
26670 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
26680 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26690 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
266a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
266b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
266c0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
266d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
266e0 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
266f0 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ly );.      pPag
26700 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
26710 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65  R_SHARED;.    }e
26720 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
26730 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
26740 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
26750 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
26760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26770 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
26780 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
26790 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
267a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
267b0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
267c0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
267d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
267e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
267f0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
26800 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
26810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
26820 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
26830 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
26840 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
26850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
26860 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
26870 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
26880 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
26890 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
268a0 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20  ( !isErrorReset 
268b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
268c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c   pPager->state <
268d0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  = PAGER_SHARED )
268e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  ;.      rc = has
268f0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
26900 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c  r, &isHotJournal
26910 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
26920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26930 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
26940 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
26950 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72  .    if( isError
26960 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f  Reset || isHotJo
26970 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  urnal ){.      /
26980 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
26990 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
269a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
269b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
269c0 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
269d0 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
269e0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
269f0 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
26a00 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
26a10 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
26a20 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
26a30 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
26a40 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
26a50 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
26a60 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
26a70 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
26a80 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
26a90 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
26aa0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
26ab0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
26ac0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
26ad0 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
26ae0 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
26af0 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
26b00 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
26b10 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
26b20 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
26b30 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
26b40 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
26b50 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
26b60 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
26b70 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
26b80 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
26b90 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
26ba0 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
26bb0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
26bc0 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
26bd0 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
26be0 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
26bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26c00 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
26c10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
26c20 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ate<EXCLUSIVE_LO
26c30 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
26c40 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
26c50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
26c60 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
26c70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26c90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26ca0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
26cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
26cc0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
26cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
26ce0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
26cf0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
26d00 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
26d10 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
26d20 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
26d30 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
26d40 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
26d50 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
26d60 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
26d70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
26d80 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
26d90 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f   and.      ** po
26da0 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
26db0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
26dc0 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
26dd0 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
26de0 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
26df0 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
26e00 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
26e10 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
26e20 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  res.      ** a r
26e30 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
26e40 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  andle..      */.
26e50 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
26e60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
26e70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
26e80 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
26e90 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
26ea0 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f  pVfs,pPager->zJo
26eb0 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43  urnal,SQLITE_ACC
26ec0 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29  ESS_EXISTS,&res)
26ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26ef0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
26f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26f10 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
26f20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
26f30 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
26f40 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
26f50 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
26f60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
26f70 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
26f80 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
26f90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26fa0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
26fb0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26fc0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
26fd0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
26fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
26ff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
27000 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27010 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
27020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27030 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
27040 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
27050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27060 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
27070 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
27080 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
27090 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
270a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
270b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
270c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
270d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
270e0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
270f0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
27100 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
27110 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27120 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
27130 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
27140 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
27150 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
27160 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
27170 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
27180 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
27190 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
271a0 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  , it .          
271b0 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
271c0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
271d0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
271e0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
271f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
27200 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
27210 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
27220 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
27230 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  xist.  */.      
27240 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
27250 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
27260 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
27270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27280 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
27290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
272a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
272b0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
272c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73   }..      /* Res
272d0 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  et the journal s
272e0 74 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20  tatus fields to 
272f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
27300 65 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20  e have no.      
27310 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
27320 6e 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65  nal at this time
27330 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
27340 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
27350 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
27360 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
27370 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
27380 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
27390 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
273a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
273b0 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20   .      /* Make 
273c0 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sure the journal
273d0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
273e0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a  ynced to disk. *
273f0 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  /. .      /* Pla
27400 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
27410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
27420 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
27430 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
27440 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
27450 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
27460 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
27470 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
27480 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
27490 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
274a0 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
274b0 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
274c0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
274d0 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
274e0 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
274f0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
27500 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
27510 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
27520 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
27530 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
27540 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
27550 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
27560 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
27570 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
27580 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
27590 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
275a0 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
275b0 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
275c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
275d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
275e0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
275f0 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
27600 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
27610 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27630 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
27640 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
27650 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  r, 1);.        }
27660 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
27670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27680 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
27690 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
276a0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
276b0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
276c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
276d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
276e0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
276f0 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
27700 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
27710 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
27720 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
27730 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
27740 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
27750 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
27760 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65  Backup || sqlite
27770 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
27780 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
27790 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>0 ){.      /* 
277a0 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
277b0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
277c0 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61  quired on the da
277d0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20  tabase file.    
277e0 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
277f0 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73  re already pages
27800 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66   in the cache (f
27810 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20  rom a previous. 
27820 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
27830 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
27840 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
27850 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
27860 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62  e.      ** has b
27870 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
27880 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
27890 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
278a0 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  h the.      ** c
278b0 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ache..      **. 
278c0 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
278d0 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
278e0 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
278f0 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
27900 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
27910 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
27920 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
27930 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
27940 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
27950 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
27960 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
27970 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
27980 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
27990 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
279a0 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
279b0 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
279c0 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
279d0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
279e0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
279f0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
27a00 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
27a10 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
27a20 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
27a30 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
27a40 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
27a50 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
27a60 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
27a70 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
27a80 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
27a90 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
27aa0 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
27ab0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
27ac0 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
27ad0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
27ae0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
27af0 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )];.      sqlite
27b00 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
27b10 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
27b20 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
27b30 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
27b40 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67         rc = pPag
27b50 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
27b60 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
27b70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27b80 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
27b90 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
27ba0 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
27bb0 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
27bc0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
27bd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27be0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
27bf0 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
27c00 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
27c10 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
27c20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27c30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27c40 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
27c50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27c70 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
27c80 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
27c90 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
27ca0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
27cb0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
27cc0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
27cd0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
27ce0 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
27cf0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
27d00 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
27d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
27d20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
27d30 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
27d40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
27d50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
27d60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
27d70 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e  is a WAL file in
27d80 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
27d90 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61  , open this data
27da0 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20  base in WAL.    
27db0 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69  ** mode. Otherwi
27dc0 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  se, the followin
27dd0 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  g function call 
27de0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
27df0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
27e00 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
27e10 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
27e20 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
27e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27e40 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c      /* pager_unl
27e50 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
27e60 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d   for exclusive m
27e70 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72  ode and in-memor
27e80 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  y databases. */.
27e90 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
27ea0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
27eb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27ec0 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
27ed0 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
27ee0 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
27ef0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
27f00 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
27f10 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
27f20 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
27f30 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
27f40 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
27f50 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
27f60 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
27f70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
27f80 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
27f90 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
27fa0 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
27fb0 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
27fc0 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
27fd0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
27fe0 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
27ff0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
28000 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
28010 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
28020 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
28030 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
28040 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50  )==0).   && (!pP
28050 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
28060 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
28070 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20  ournalOff>0) .  
28080 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
28090 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
280a0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
280b0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
280c0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
280d0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
280e0 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
280f0 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
28100 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
28110 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
28120 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
28130 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
28140 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
28150 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
28160 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
28170 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
28180 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
28190 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
281a0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
281b0 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
281c0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
281d0 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
281e0 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
281f0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
28200 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
28210 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
28220 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
28230 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
28240 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
28250 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
28260 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
28270 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
28280 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
28290 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
282a0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
282b0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
282c0 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
282d0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
282e0 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
282f0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
28300 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
28310 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
28320 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
28330 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
28340 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
28350 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
28360 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
28370 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
28380 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
28390 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
283a0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
283b0 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
283c0 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
283d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
283e0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
283f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
28400 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
28410 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
28420 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
28430 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
28440 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
28450 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
28460 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
28470 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
28480 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
28490 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
284a0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
284b0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
284c0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
284d0 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
284e0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
284f0 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
28500 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
28510 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
28520 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
28530 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
28540 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
28550 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
28560 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
28570 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
28580 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
28590 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
285a0 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
285b0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
285c0 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
285d0 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
285e0 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
285f0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
28600 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
28610 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
28620 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
28630 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
28640 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
28650 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
28660 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
28670 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
28680 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
28690 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
286a0 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
286b0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
286c0 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
286d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
286e0 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
286f0 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
28700 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
28710 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
28720 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
28730 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
28740 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
28750 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
28760 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
28770 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
28780 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
28790 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
287a0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
287b0 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
287c0 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
287d0 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
287e0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
287f0 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
28800 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28810 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
28820 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
28830 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
28840 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
28850 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
28860 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
28870 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
28880 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
28890 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
288a0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
288b0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
288c0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
288d0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
288e0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
288f0 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
28900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
28910 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
28920 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
28930 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
28940 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
28950 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
28960 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
28970 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
28980 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
28990 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
289a0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
289b0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
289c0 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
289d0 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
289e0 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
289f0 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
28a00 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
28a10 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
28a20 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
28a30 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
28a40 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
28a50 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
28a60 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
28a70 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
28a80 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
28a90 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
28aa0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
28ab0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
28ac0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
28ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
28ae0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
28af0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
28b00 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
28b10 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
28b20 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
28b30 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
28b40 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
28b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
28b60 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
28b70 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
28b80 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
28b90 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
28ba0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
28bb0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
28bc0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
28bd0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  Pg;..  assert( a
28be0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
28bf0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
28c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
28c10 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43  tate>PAGER_UNLOC
28c20 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  K );..  if( pgno
28c30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
28c40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28c50 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
28c60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
28c70 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
28c80 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ate, return an e
28c90 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  rror immediately
28ca0 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
28cb0 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70  e, request the p
28cc0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61  age from the PCa
28cd0 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20  che layer. */.  
28ce0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
28cf0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  ode!=SQLITE_OK &
28d00 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
28d10 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
28d20 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
28d30 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
28d40 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
28d50 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
28d60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
28d70 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67  , pgno, 1, ppPag
28d80 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
28d90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28da0 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
28db0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
28dc0 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72  3PcacheFetch() r
28dd0 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
28de0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   or the.    ** p
28df0 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79  ager was already
28e00 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
28e10 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
28e20 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
28e30 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50  d..    ** Set pP
28e40 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20  g to 0 and jump 
28e50 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  to the exception
28e60 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20   handler.  */.  
28e70 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67    pPg = 0;.    g
28e80 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
28e90 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73  e_err;.  }.  ass
28ea0 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
28eb0 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
28ec0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
28ed0 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  )->pPager==pPage
28ee0 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  r || (*ppPage)->
28ef0 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20  pPager==0 );..  
28f00 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  if( (*ppPage)->p
28f10 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
28f20 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
28f30 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
28f40 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
28f50 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
28f60 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
28f70 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
28f80 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
28f90 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
28fa0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
28fb0 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
28fc0 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
28fd0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
28fe0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
28ff0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
29000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29010 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
29020 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
29030 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
29040 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
29050 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
29060 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
29070 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
29080 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20      int nMax;.. 
29090 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
290a0 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
290b0 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b    pPg = *ppPage;
290c0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
290d0 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
290e0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
290f0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
29100 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
29110 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
29120 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
29130 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
29140 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
29150 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
29160 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
29170 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
29180 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
29190 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
291a0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
291b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
291c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
291d0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
291e0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
291f0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71    }..    rc = sq
29200 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
29210 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61  unt(pPager, &nMa
29220 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  x);.    if( rc!=
29230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29240 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
29250 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
29260 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ..    if( MEMDB 
29270 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  || nMax<(int)pgn
29280 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c  o || noContent |
29290 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
292a0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
292b0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
292c0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
292d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
292e0 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
292f0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
29300 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
29310 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
29320 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
29330 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
29340 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
29350 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
29360 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
29370 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
29380 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
29390 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
293a0 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
293b0 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
293c0 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
293d0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
293e0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
293f0 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
29400 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
29410 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
29420 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
29430 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
29440 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
29450 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
29460 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
29470 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
29480 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
29490 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
294a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
294b0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
294c0 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
294d0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
294e0 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
294f0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
29500 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
29510 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
29520 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
29530 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
29540 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
29550 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
29560 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
29570 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
29580 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
29590 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
295a0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
295b0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
295c0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
295d0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
295e0 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
295f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
29600 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
29610 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
29620 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
29630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29640 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
29650 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
29660 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
29670 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
29680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
296a0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
296b0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
296c0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
296d0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
296e0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
296f0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
29700 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
29710 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
29720 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
29730 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
29740 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29750 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
29760 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
29770 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
29780 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
29790 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
297a0 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  ;..  *ppPage = 0
297b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
297c0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
297d0 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
297e0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
297f0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
29800 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
29810 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
29820 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
29830 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
29840 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
29850 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
29860 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65   cache. Also, re
29870 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a  turn 0 if the .*
29880 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  * pager is in PA
29890 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
298a0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
298b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
298c0 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  * or if the page
298d0 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
298e0 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
298f0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a  n SQLITE_FULL..*
29900 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
29910 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
29920 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
29930 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
29940 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
29950 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
29960 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
29970 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
29980 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
29990 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
299a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
299b0 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
299c0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
299d0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
299e0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
299f0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
29a00 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
29a10 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
29a20 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
29a30 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
29a40 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
29a50 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
29a60 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
29a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29a80 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
29a90 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
29aa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29ab0 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
29ac0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29ad0 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55 4e  state > PAGER_UN
29ae0 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  LOCK );.  sqlite
29af0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
29b00 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
29b10 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
29b20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
29b30 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
29b40 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
29b50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
29b60 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
29b70 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
29b80 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
29b90 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
29ba0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
29bb0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
29bc0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
29bd0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
29be0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
29bf0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
29c00 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
29c10 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
29c20 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
29c30 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29c40 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
29c50 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
29c60 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
29c70 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
29c80 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
29c90 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
29ca0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
29cb0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
29cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
29cd0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
29ce0 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  le has already b
29cf0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75  een opened, ensu
29d00 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  re that the.** s
29d10 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29d20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20  is open too. If 
29d30 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
29d40 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a   is not open,.**
29d50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
29d60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
29d70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29d80 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
29d90 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
29da0 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a  ing to plan. .**
29db0 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   An SQLITE_IOERR
29dc0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
29dd0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
29de0 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
29df0 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61 69  ite3OsOpen() fai
29e00 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
29e10 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
29e20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
29e30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29e40 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 28 70 61  TE_OK;.  if( (pa
29e50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29e60 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  ) || isOpen(pPag
29e70 65 72 2d 3e 6a 66 64 29 29 20 26 26 20 21 69 73  er->jfd)) && !is
29e80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
29e90 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
29ea0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
29eb0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
29ec0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
29ed0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
29ee0 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
29ef0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
29f00 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
29f10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29f20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
29f30 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
29f40 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
29f50 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
29f60 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
29f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29f80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
29f90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
29fa0 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
29fb0 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
29fc0 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
29fd0 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
29fe0 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
29ff0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2a000 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2a010 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
2a020 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2a030 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
2a040 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
2a050 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
2a060 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
2a070 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
2a080 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
2a090 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
2a0a0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
2a0b0 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
2a0c0 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
2a0d0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2a0e0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
2a0f0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2a100 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
2a110 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
2a120 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
2a130 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
2a140 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
2a150 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
2a160 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
2a170 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
2a180 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
2a190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a1a0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
2a1b0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
2a1c0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
2a1d0 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
2a1e0 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
2a1f0 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
2a200 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
2a210 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
2a220 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
2a230 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
2a240 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
2a250 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
2a260 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2a270 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
2a280 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
2a290 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2a2a0 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
2a2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2a2c0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
2a2d0 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
2a2e0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
2a2f0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
2a300 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
2a310 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
2a320 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
2a330 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
2a340 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
2a350 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
2a360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2a370 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
2a380 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
2a390 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
2a3a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2a3b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2a3e0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
2a3f0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2a420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2a430 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
2a440 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
2a450 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
2a460 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
2a470 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
2a480 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a490 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2a4a0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
2a4b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2a4c0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2a4d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2a4e0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2a4f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2a500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2a510 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2a520 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
2a530 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
2a540 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
2a550 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2a560 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
2a570 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
2a580 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
2a590 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
2a5a0 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
2a5b0 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
2a5c0 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2a5d0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2a5e0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2a5f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2a600 43 6f 64 65 3b 0a 0a 20 20 74 65 73 74 63 61 73  Code;..  testcas
2a610 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
2a620 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 72  eValid==0 );.  r
2a630 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a640 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2a650 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
2a660 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a670 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
2a680 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
2a690 69 74 76 65 63 43 72 65 61 74 65 28 6e 50 61 67  itvecCreate(nPag
2a6a0 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
2a6b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
2a6c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a6d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2a6e0 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a  .  /* Open the j
2a6f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
2a700 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2a710 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20   open. */.  if( 
2a720 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2a730 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
2a740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2a750 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2a760 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
2a770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
2a780 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
2a790 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
2a7a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
2a7b0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
2a7e0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
2a7f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  e */.        SQL
2a800 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2a810 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
2a820 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28  REATE|.        (
2a830 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2a840 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53   ? .          (S
2a850 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
2a860 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
2a870 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
2a880 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53  L):.          (S
2a890 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2a8a0 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20  JOURNAL).       
2a8b0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
2a8c0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2a8d0 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d  WRITE.      rc =
2a8e0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
2a8f0 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  pen(.          p
2a900 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2a910 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2a920 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
2a930 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
2a940 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65  ).      );.#else
2a950 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2a960 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2a970 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2a980 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2a990 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
2a9a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2a9b0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2a9c0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
2a9d0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a  r->jfd) );.  }..
2a9e0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
2a9f0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
2aa00 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
2aa10 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
2aa20 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  n .  ** the sub-
2aa30 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
2aa40 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sary..  */.  if(
2aa50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2aa60 7b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43  {.    /* TODO: C
2aa70 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
2aa80 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
2aa90 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
2aaa0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
2aab0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
2aac0 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72  Size;.    pPager
2aad0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
2aae0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2aaf0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
2ab00 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
2ab10 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2ab20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
2ab30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
2ab40 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
2ab50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ab60 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Hdr = 0;.    rc 
2ab70 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
2ab80 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
2ab90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2aba0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  OK && pPager->nS
2abb0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2abc0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2abd0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
2abe0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
2abf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2ac00 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
2ac10 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
2ac20 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
2ac30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
2ac40 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2ac50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
2ac60 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
2ac70 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
2ac80 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
2ac90 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
2aca0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
2acb0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2acc0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
2acd0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2ace0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
2acf0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
2ad00 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
2ad10 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
2ad20 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
2ad30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2ad40 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
2ad50 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
2ad60 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
2ad70 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
2ad80 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
2ad90 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
2ada0 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
2adb0 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
2adc0 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
2add0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2ade0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
2adf0 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  ry or in-memory 
2ae00 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f  file and, the jo
2ae10 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a  urnal file is .*
2ae20 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68  * opened if it h
2ae30 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65  as not been alre
2ae40 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f  ady. For a tempo
2ae50 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f  rary file, the o
2ae60 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68  pening .** of th
2ae70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2ae80 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
2ae90 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74   there is an act
2aea0 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20  ual need to .** 
2aeb0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
2aec0 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20  rnal. TODO: Why 
2aed0 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79  handle temporary
2aee0 20 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74   files different
2aef0 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ly?.**.** If the
2af00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2af10 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69   opened (or if i
2af20 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
2af30 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f  n), then a.** jo
2af40 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
2af50 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
2af60 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a  tart of it..**.*
2af70 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
2af80 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
2af90 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2afa0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
2afb0 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
2afc0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
2afd0 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
2afe0 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
2aff0 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
2b000 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
2b010 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b020 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2b030 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
2b040 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
2b050 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2b060 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
2b070 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
2b080 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
2b090 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
2b0a0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
2b0b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
2b0c0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
2b0d0 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
2b0e0 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
2b0f0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
2b100 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
2b110 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
2b120 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
2b130 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
2b140 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
2b150 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
2b160 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
2b170 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
2b180 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
2b190 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b1a0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
2b1b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
2b1c0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
2b1d0 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
2b1e0 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
2b1f0 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
2b200 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2b210 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
2b220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2b230 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2b240 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2b250 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61  ( !MEMDB && !pPa
2b260 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2b270 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
2b280 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2b290 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2b2a0 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
2b2b0 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
2b2c0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2b2d0 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
2b2e0 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
2b2f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2b300 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
2b310 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
2b320 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
2b330 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2b340 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2b350 26 26 20 21 73 71 6c 69 74 65 33 57 61 6c 45 78  && !sqlite3WalEx
2b360 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
2b370 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
2b380 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2b390 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
2b3a0 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
2b3b0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2b3c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2b3d0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
2b3e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2b3f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b400 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2b410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b420 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63     sqlite3WalExc
2b430 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
2b440 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
2b450 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
2b460 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
2b470 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
2b480 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
2b490 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
2b4a0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
2b4b0 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
2b4c0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
2b4d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
2b4e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2b4f0 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
2b500 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
2b510 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
2b520 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
2b530 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
2b540 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
2b550 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
2b560 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
2b570 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
2b580 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
2b590 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
2b5a0 65 72 2e 73 74 61 74 65 20 74 6f 20 50 41 47 45  er.state to PAGE
2b5b0 52 5f 52 45 53 45 52 56 45 44 20 77 68 65 6e 20  R_RESERVED when 
2b5c0 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a 20  it has an open. 
2b5d0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2b5e0 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74  ion, but never t
2b5f0 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
2b600 45 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  E. This is becau
2b610 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  se in .      ** 
2b620 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2b630 73 74 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  state the code t
2b640 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
2b650 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
2b660 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ns.      ** may 
2b670 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
2b680 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
2b690 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
2b6a0 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 0a 20 20   file as well.  
2b6b0 20 20 20 20 2a 2a 20 61 73 20 69 6e 74 6f 20 74      ** as into t
2b6c0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
2b6d0 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
2b6e0 63 6f 72 72 65 63 74 20 69 6e 20 57 41 4c 20 6d  correct in WAL m
2b6f0 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
2b700 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b710 57 61 6c 57 72 69 74 65 4c 6f 63 6b 28 70 50 61  WalWriteLock(pPa
2b720 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
2b730 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b750 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
2b760 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2b770 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 70  bSize;.        p
2b780 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2b790 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
2b7a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
2b7b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
2b7c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2b7d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2b7e0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  _OK || pPager->s
2b7f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
2b800 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 61 73  RVED );.      as
2b810 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2b820 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  _OK || pPager->s
2b830 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
2b840 45 44 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ED );.    }else{
2b850 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
2b860 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2b870 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2b880 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
2b890 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
2b8a0 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
2b8b0 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
2b8c0 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
2b8d0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
2b8e0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
2b8f0 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
2b900 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
2b910 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
2b920 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
2b930 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
2b940 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
2b950 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
2b960 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
2b970 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2b980 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
2b990 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
2b9a0 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
2b9b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b9c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
2b9d0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2b9e0 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
2b9f0 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
2ba00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2ba10 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
2ba20 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
2ba30 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
2ba40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ba50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
2ba60 6f 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20 74  o need to open t
2ba70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ba80 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 49  at this time.  I
2ba90 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  t will be.    **
2baa0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 69   opened before i
2bab0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 2e  t is written to.
2bac0 20 20 49 66 20 77 65 20 64 65 66 65 72 20 6f 70    If we defer op
2bad0 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
2bae0 6c 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69 67  l,.    ** we mig
2baf0 68 74 20 73 61 76 65 20 74 68 65 20 77 6f 72 6b  ht save the work
2bb00 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20 66   of creating a f
2bb10 69 6c 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  ile if the trans
2bb20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e  action.    ** en
2bb30 64 73 20 75 70 20 62 65 69 6e 67 20 61 20 6e 6f  ds up being a no
2bb40 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d 65  -op..    */.  }e
2bb50 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70  lse if( isOpen(p
2bb60 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
2bb70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2bb80 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
2bb90 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
2bba0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
2bbb0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
2bbc0 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74  ss mode the last
2bbd0 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
2bbe0 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
2bbf0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
2bc00 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
2bc10 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
2bc20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
2bc30 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
2bc40 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
2bc50 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
2bc60 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
2bc70 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72  nd either was tr
2bc80 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
2bc90 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72  es or its header
2bca0 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72   was.    ** over
2bcb0 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72  written with zer
2bcc0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  os..    */.    a
2bcd0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
2bce0 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
2bcf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2bd00 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
2bd10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2bd20 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
2bd30 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2bd40 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2bd50 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  nal==0 );.    rc
2bd60 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
2bd70 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
2bd80 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2bd90 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  (("TRANSACTION %
2bda0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2bdb0 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 72  ager)));.  if( r
2bdc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bdd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2bde0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2bdf0 29 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  );.    /* Ignore
2be00 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74 68   any IO error th
2be10 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  at occurs within
2be20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2be30 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20  action(). The.  
2be40 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66 20    ** purpose of 
2be50 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20  this call is to 
2be60 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e  reset the intern
2be70 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  al state of the 
2be80 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75 62  pager.    ** sub
2be90 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65 73  -system. It does
2bea0 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74 68  n't matter if th
2beb0 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
2bec0 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20  s not properly. 
2bed0 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20     ** finalized 
2bee0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28 73  at this point (s
2bef0 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20 61  ince it is not a
2bf00 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66   valid journal f
2bf10 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20 20  ile anyway)..   
2bf20 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65 6e   */.    pager_en
2bf30 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2bf40 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
2bf50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bf60 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
2bf70 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
2bf80 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
2bf90 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2bfa0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
2bfb0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
2bfc0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
2bfd0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2bfe0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
2bff0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
2c000 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
2c010 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
2c020 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
2c030 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
2c040 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
2c050 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
2c060 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
2c070 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
2c080 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
2c090 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
2c0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2c0b0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
2c0c0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
2c0d0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
2c0e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2c0f0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2c100 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c110 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  E_OK;..  /* This
2c120 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
2c130 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
2c140 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2c150 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 2a  already been.  *
2c160 2a 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  * started..  */.
2c170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c180 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
2c190 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a  ESERVED );..  /*
2c1a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
2c1b0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
2c1c0 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f 72   detected, repor
2c1d0 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  t the same error
2c1e0 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a  .  ** again..  *
2c1f0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
2c200 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
2c210 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
2c220 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
2c230 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  Higher-level rou
2c240 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c  tines never call
2c250 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c260 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  f database is no
2c270 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e  t.  ** writable.
2c280 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77    But check anyw
2c290 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62  ay, just for rob
2c2a0 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
2c2b0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2c2c0 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75  readOnly) ) retu
2c2d0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
2c2e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
2c2f0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
2c300 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
2c310 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
2c320 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
2c330 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
2c340 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2c350 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
2c360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
2c370 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
2c380 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
2c390 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2c3a0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
2c3b0 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72    if( pageInJour
2c3c0 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62  nal(pPg) && !sub
2c3d0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2c3e0 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  g) ){.    assert
2c3f0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2c400 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
2c410 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2c420 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
2c430 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
2c440 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
2c450 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
2c460 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
2c470 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
2c480 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2c490 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
2c4a0 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
2c4b0 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
2c4c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2c4d0 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
2c4e0 74 69 6e 65 73 20 73 68 6f 75 6c 64 20 68 61 76  tines should hav
2c4f0 65 20 61 6c 72 65 61 64 79 20 73 74 61 72 74 65  e already starte
2c500 64 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  d a transaction,
2c510 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 6d 65  .    ** which me
2c520 61 6e 73 20 74 68 65 79 20 68 61 76 65 20 61 63  ans they have ac
2c530 71 75 69 72 65 64 20 74 68 65 20 6e 65 63 65 73  quired the neces
2c540 73 61 72 79 20 6c 6f 63 6b 73 20 62 75 74 20 74  sary locks but t
2c550 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  he rollback.    
2c560 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  ** journal might
2c570 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e   not yet be open
2c580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2c590 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
2c5a0 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70  gin(pPager, 0, p
2c5b0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
2c5c0 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ory);.    if( rc
2c5d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c5e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2c5f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
2c600 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2c610 64 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  d) .     && pPag
2c620 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2c630 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2c640 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 26 26 20  DE_OFF .     && 
2c650 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
2c660 67 65 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ger).    ){.    
2c670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c680 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2c690 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2c6a0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
2c6b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
2c6c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c6d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2c6e0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  }.    pPager->db
2c6f0 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Modified = 1;.  
2c700 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
2c710 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
2c720 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
2c730 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
2c740 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
2c750 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
2c760 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
2c770 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
2c780 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2c790 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
2c7a0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
2c7b0 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
2c7c0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
2c7d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
2c7e0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
2c7f0 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  ) && isOpen(pPag
2c800 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2c810 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
2c820 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2c830 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
2c840 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
2c850 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
2c860 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
2c870 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
2c880 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
2c890 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
2c8a0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
2c8b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
2c8c0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
2c8d0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
2c8e0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
2c8f0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
2c900 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
2c910 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
2c920 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
2c930 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2c940 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
2c950 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
2c960 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
2c970 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2c980 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
2c990 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
2c9a0 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
2c9b0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2c9c0 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2c9d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
2c9e0 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2c9f0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
2ca00 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
2ca10 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
2ca20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
2ca30 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
2ca40 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
2ca50 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  lOff, pPg->pgno)
2ca60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ca70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ca80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ca90 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2caa0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
2cab0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2cac0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cae0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2caf0 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
2cb00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2cb10 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
2cb20 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
2cb30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cb40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2cb50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2cb60 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2cb70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2cb80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2cb90 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
2cba0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2cbb0 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
2cbc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
2cbd0 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
2cbe0 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
2cbf0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2cc00 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
2cc10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2cc20 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
2cc30 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
2cc40 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
2cc50 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2cc60 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
2cc70 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2cc80 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
2cc90 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
2cca0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
2ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2ccc0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2ccd0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
2cce0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
2ccf0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2cd00 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
2cd10 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
2cd20 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
2cd30 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
2cd40 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
2cd50 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75  curred while jou
2cd60 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
2cd70 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
2cd80 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
2cd90 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
2cda0 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
2cdb0 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
2cdc0 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
2cdd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2cde0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
2cdf0 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
2ce00 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
2ce10 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
2ce20 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
2ce30 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
2ce40 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
2ce50 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
2ce60 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
2ce70 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2ce80 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
2ce90 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
2cea0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
2ceb0 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
2cec0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ced0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
2cee0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
2cef0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
2cf00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
2cf10 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2cf20 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
2cf30 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2cf40 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
2cf50 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69 74  as occurred writ
2cf60 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
2cf70 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
2cf80 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
2cf90 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
2cfa0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
2cfb0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
2cfc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2cfd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cfe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2cff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d000 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61    }..        pPa
2d010 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
2d020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2d030 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
2d040 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
2d050 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
2d060 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
2d070 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
2d080 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
2d090 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
2d0a0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2d0b0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2d0c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
2d0d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
2d0e0 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
2d0f0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2d100 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2d110 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
2d120 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
2d140 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2d150 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2d160 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d180 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
2d190 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
2d1a0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
2d1b0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2d1c0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
2d1d0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
2d1e0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
2d1f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
2d200 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2d210 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
2d220 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
2d230 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
2d240 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
2d250 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
2d260 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2d270 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
2d280 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
2d290 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2d2a0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20  C)?1:0)));.     
2d2b0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
2d2c0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
2d2d0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
2d2e0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
2d2f0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
2d300 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
2d310 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2d320 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
2d330 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
2d340 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
2d350 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
2d360 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
2d370 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
2d380 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
2d390 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
2d3a0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
2d3b0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
2d3c0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
2d3d0 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
2d3e0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2d3f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
2d400 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2d410 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d420 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
2d430 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
2d440 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
2d450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2d460 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
2d470 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
2d480 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
2d490 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
2d4a0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
2d4b0 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
2d4c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2d4d0 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
2d4e0 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
2d4f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
2d500 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
2d510 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68  re .** making ch
2d520 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
2d530 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2d540 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
2d550 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74  n value .** of t
2d560 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
2d570 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
2d580 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  to change any pa
2d590 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a  ge data unless .
2d5a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2d5b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2d5c0 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  K..**.** The dif
2d5d0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
2d5e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
2d5f0 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
2d600 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
2d610 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
2d620 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
2d630 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
2d640 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
2d650 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
2d660 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
2d670 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
2d680 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
2d690 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
2d6a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2d6b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d6c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2d6d0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
2d6e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
2d6f0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
2d700 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2d710 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20   returned.** as 
2d720 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68  appropriate. Oth
2d730 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
2d740 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
2d750 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
2d760 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
2d770 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d780 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
2d790 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
2d7a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2d7b0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
2d7c0 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
2d7d0 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
2d7e0 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
2d7f0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66  pageSize);..  if
2d800 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
2d810 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
2d820 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
2d830 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2d840 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2d850 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2d860 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
2d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d880 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
2d890 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
2d8a0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
2d8b0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
2d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d8d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2d8e0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
2d8f0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
2d900 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d920 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2d930 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
2d940 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
2d950 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
2d960 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
2d970 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
2d980 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
2d990 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
2d9a0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
2d9b0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
2d9c0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2d9d0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
2d9e0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
2d9f0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
2da00 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2da10 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
2da20 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
2da30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2da40 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
2da50 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2da60 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
2da70 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
2da80 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
2da90 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
2daa0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
2dab0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
2dac0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
2dad0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
2dae0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
2daf0 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
2db00 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
2db10 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
2db20 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
2db30 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
2db40 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
2db50 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
2db60 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
2db70 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2db80 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2db90 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  (pPager, (int *)
2dba0 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20  &nPageCount);.  
2dbb0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2dbc0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50  n rc;.    if( pP
2dbd0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
2dbe0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
2dbf0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
2dc00 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
2dc10 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
2dc20 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
2dc30 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
2dc40 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
2dc50 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
2dc60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
2dc70 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
2dc80 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
2dc90 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
2dca0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
2dcb0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2dcc0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
2dcd0 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
2dce0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2dcf0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
2dd00 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
2dd10 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
2dd20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
2dd30 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
2dd40 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
2dd50 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
2dd60 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2dd70 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
2dd80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
2dd90 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
2dda0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
2ddb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2ddc0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
2ddd0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
2dde0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ddf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2de00 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2de10 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
2de20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2de30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
2de40 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2de50 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
2de60 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
2de70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2de80 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
2de90 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
2dea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2deb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2dec0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2ded0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dee0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
2def0 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
2df00 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2df10 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
2df20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2df30 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2df40 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
2df50 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
2df60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2df70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2df80 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2df90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2dfa0 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
2dfb0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
2dfc0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
2dfd0 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
2dfe0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
2dff0 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
2e000 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
2e010 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
2e020 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
2e030 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
2e040 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
2e050 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
2e060 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
2e070 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2e080 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
2e090 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
2e0a0 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
2e0b0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
2e0c0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
2e0d0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
2e0e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e0f0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
2e100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e110 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a   && needSync ){.
2e120 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d        assert( !M
2e130 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
2e140 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  noSync==0 );.   
2e150 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2e160 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  nPage; ii++){.  
2e170 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
2e180 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
2e190 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69  p(pPager, pg1+ii
2e1a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2e1b0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2e1c0 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c    pPage->flags |
2e1d0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2e1e0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  C;.          sql
2e1f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2e200 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2e210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2e220 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65  ssert(pPager->ne
2e230 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a  edSync);.    }..
2e240 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e250 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
2e260 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2e270 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
2e280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
2e290 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
2e2a0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
2e2b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2e2c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2e2d0 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
2e2e0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
2e2f0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
2e300 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
2e310 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
2e320 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2e330 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
2e340 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
2e350 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
2e360 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
2e370 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
2e380 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e390 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
2e3a0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
2e3b0 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  urn pPg->flags&P
2e3c0 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65  GHDR_DIRTY;.}.#e
2e3d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
2e3e0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
2e3f0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
2e400 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
2e410 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
2e420 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
2e430 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
2e440 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
2e450 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
2e460 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
2e470 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
2e480 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68  s dirty.  This h
2e490 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
2e4a0 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ple, when.** the
2e4b0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
2e4c0 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f  dded as a leaf o
2e4d0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  f the freelist a
2e4e0 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e  nd so its.** con
2e4f0 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d  tent no longer m
2e500 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  atters..**.** Th
2e510 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
2e520 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
2e530 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
2e540 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
2e550 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
2e560 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
2e570 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  d. The pager mar
2e580 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
2e590 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
2e5a0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
2e5b0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2e5c0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
2e5d0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
2e5e0 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61  mization can qua
2e5f0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
2e600 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45   of large .** DE
2e610 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e  LETE operations.
2e620 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2e630 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
2e640 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2e650 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2e660 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2e670 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2e680 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
2e690 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
2e6a0 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  =0 ){.    PAGERT
2e6b0 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54  RACE(("DONT_WRIT
2e6c0 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
2e6d0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
2e6e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2e6f0 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
2e700 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
2e710 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2e720 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61  o)).    pPg->fla
2e730 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54  gs |= PGHDR_DONT
2e740 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53  _WRITE;.#ifdef S
2e750 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
2e760 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
2e770 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
2e780 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
2e790 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  f.  }.}../*.** T
2e7a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2e7b0 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
2e7c0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
2e7d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e7e0 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
2e7f0 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
2e800 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
2e810 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
2e820 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
2e830 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
2e840 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a  e pager file..**
2e850 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72  .** If the isDir
2e860 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 69 73 20  ectMode flag is 
2e870 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
2e880 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69  is done by calli
2e890 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
2e8a0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61  gerWrite() on pa
2e8b0 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge 1, then modif
2e8c0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
2e8d0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  s of the.** page
2e8e0 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63   data. In this c
2e8f0 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ase the file wil
2e900 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65  l be updated whe
2e910 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
2e920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2e930 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2e940 20 54 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   The isDirectMod
2e950 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20  e flag may only 
2e960 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  be non-zero if t
2e970 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
2e980 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20  ompiled.** with 
2e990 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
2e9a0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d  E_ATOMIC_WRITE m
2e9b0 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e  acro defined. In
2e9c0 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69   this case,.** i
2e9d0 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e 6f  f isDirect is no
2e9e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
2e9f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2ea00 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63 74  s updated direct
2ea10 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e 67  ly.** by writing
2ea20 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72 73   an updated vers
2ea30 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75 73  ion of page 1 us
2ea40 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74 68  ing a call to th
2ea50 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57  e .** sqlite3OsW
2ea60 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rite() function.
2ea70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2ea80 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2ea90 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
2eaa0 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69 72  Pager, int isDir
2eab0 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ectMode){.  int 
2eac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2ead0 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e  .  /* Declare an
2eae0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e  d initialize con
2eaf0 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69  stant integer 'i
2eb00 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68 65  sDirect'. If the
2eb10 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69  .  ** atomic-wri
2eb20 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2eb30 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68  is enabled in th
2eb40 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69  is build, then i
2eb50 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20  sDirect.  ** is 
2eb60 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
2eb70 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2eb80 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  as the isDirectM
2eb90 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ode parameter.  
2eba0 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
2ebb0 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
2ebc0 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65 74  it is always set
2ebd0 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20   to zero..  **. 
2ebe0 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20   ** The idea is 
2ebf0 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d  that if the atom
2ec00 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2ec10 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a  ation is not.  *
2ec20 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  * enabled at com
2ec30 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63  pile time, the c
2ec40 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74  ompiler can omit
2ec50 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20   the tests of.  
2ec60 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62 65  ** 'isDirect' be
2ec70 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20  low, as well as 
2ec80 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73  the block enclos
2ec90 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22  ed in the.  ** "
2eca0 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22 20  if( isDirect )" 
2ecb0 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  condition..  */.
2ecc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
2ecd0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2ece0 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45  TE.# define DIRE
2ecf0 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65  CT_MODE 0.  asse
2ed00 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65  rt( isDirectMode
2ed10 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ==0 );.  UNUSED_
2ed20 50 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65  PARAMETER(isDire
2ed30 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23  ctMode);.#else.#
2ed40 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d   define DIRECT_M
2ed50 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65  ODE isDirectMode
2ed60 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
2ed70 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2ed80 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
2ed90 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2eda0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2edb0 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  ne && pPager->db
2edc0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67  Size>0 ){.    Pg
2edd0 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20  Hdr *pPgHdr;    
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2edf0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
2ee00 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68   1 */.    u32 ch
2ee10 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20  ange_counter;   
2ee20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2ee30 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e  al value of chan
2ee40 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
2ee50 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2ee60 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2ee70 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  le && isOpen(pPa
2ee80 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20  ger->fd) );..   
2ee90 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
2eea0 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
2eeb0 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
2eec0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2eed0 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
2eee0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73  &pPgHdr);.    as
2eef0 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20  sert( pPgHdr==0 
2ef00 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
2ef10 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
2ef20 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63  age one was fetc
2ef30 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  hed successfully
2ef40 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
2ef50 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  ion is not.    *
2ef60 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64  * operating in d
2ef70 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65  irect-mode, make
2ef80 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65   page 1 writable
2ef90 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a  .  When not in .
2efa0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f      ** direct mo
2efb0 64 65 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c  de, page 1 is al
2efc0 77 61 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63  ways held in cac
2efd0 68 65 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  he and hence the
2efe0 20 50 61 67 65 72 47 65 74 28 29 0a 20 20 20 20   PagerGet().    
2eff0 2a 2a 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61  ** above is alwa
2f000 79 73 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20  ys successful - 
2f010 68 65 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53  hence the ALWAYS
2f020 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   on rc==SQLITE_O
2f030 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  K..    */.    if
2f040 28 20 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26  ( !DIRECT_MODE &
2f050 26 20 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c  & ALWAYS(rc==SQL
2f060 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
2f070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f080 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
2f090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2f0a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f0b0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  .      /* Increm
2f0c0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
2f0d0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
2f0e0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
2f0f0 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63  e 24. */.      c
2f100 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
2f110 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
2f120 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46  (u8*)pPager->dbF
2f130 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20  ileVers);.      
2f140 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
2f150 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74  ;.      put32bit
2f160 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
2f170 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
2f180 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
2f190 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f       /* Also sto
2f1a0 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
2f1b0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
2f1c0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 2a 2f 0a  bytes 96..99 */.
2f1d0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
2f1e0 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e  ((char*)pPgHdr->
2f1f0 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
2f200 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
2f210 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2f220 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63  running in direc
2f230 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68  t mode, write th
2f240 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  e contents of pa
2f250 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65  ge 1 to the file
2f260 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44  . */.      if( D
2f270 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20  IRECT_MODE ){.  
2f280 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
2f290 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d   *zBuf = pPgHdr-
2f2a0 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >pData;.        
2f2b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2f2c0 64 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a  dbFileSize>0 );.
2f2d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f2e0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2f2f0 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
2f300 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2f310 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2f320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f330 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2f340 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2f350 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ne = 1;.        
2f360 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2f370 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
2f380 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2f390 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2f3a0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
2f3b0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
2f3c0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
2f3d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2f3e0 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
2f3f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2f400 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
2f410 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
2f420 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
2f430 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
2f440 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77  es.** or pages w
2f450 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f  ith the Pager.no
2f460 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a  Sync flag set..*
2f470 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2f480 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e  ul, or called on
2f490 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
2f4a0 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
2f4b0 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
2f4c0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2f4d0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
2f4e0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2f4f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2f500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2f510 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
2f520 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f550 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2f560 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2f570 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
2f580 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2f590 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2f5a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
2f5b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2f5c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2f5d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
2f5e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f5f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
2f600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f610 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
2f620 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
2f630 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
2f640 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
2f650 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
2f660 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
2f670 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
2f680 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
2f690 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
2f6a0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
2f6b0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
2f6c0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
2f6d0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
2f6e0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
2f6f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
2f700 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f710 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a 2a   ensures that:.*
2f720 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  *.**   * The dat
2f730 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
2f740 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70 64  e-counter is upd
2f750 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68 65  ated,.**   * the
2f760 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
2f770 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ed (unless the a
2f780 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2f790 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64  mization is used
2f7a0 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64 69  ),.**   * all di
2f7b0 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77 72  rty pages are wr
2f7c0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2f7d0 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a 20  abase file, .** 
2f7e0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2f7f0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
2f800 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ed (if required)
2f810 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
2f820 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
2f830 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ynced. .**.** Th
2f840 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
2f850 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  t remains to com
2f860 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
2f870 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c 69  ion is to finali
2f880 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c 20  ze .** (delete, 
2f890 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
2f8a0 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
2f8b0 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  of) the journal 
2f8c0 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65 6c  file (or .** del
2f8d0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
2f8e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
2f8f0 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
2f900 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
2f910 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
2f920 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
2f930 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
2f940 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
2f950 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
2f960 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
2f970 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
2f980 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
2f990 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
2f9a0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
2f9b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f9c0 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
2f9d0 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
2f9e0 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
2f9f0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
2fa00 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
2fa10 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2fa20 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
2fa30 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
2fa40 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
2fa50 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
2fa60 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
2fa70 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
2fa80 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2fa90 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
2faa0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2fab0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2fac0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  r object */.  co
2fad0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
2fae0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2faf0 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
2fb00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2fb10 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
2fb20 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  oSync           
2fb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2fb40 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20 78  ue to omit the x
2fb50 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20 66  Sync on the db f
2fb60 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
2fb70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2fb90 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2fba0 20 2f 2a 20 54 68 65 20 64 62 4f 72 69 67 53 69   /* The dbOrigSi
2fbb0 7a 65 20 69 73 20 6e 65 76 65 72 20 73 65 74 20  ze is never set 
2fbc0 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  if journal_mode=
2fbd0 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  OFF */.  assert(
2fbe0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2fbf0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2fc00 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70  NALMODE_OFF || p
2fc10 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2fc20 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  e==0 );..  /* If
2fc30 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f   a prior error o
2fc40 63 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20  ccurred, report 
2fc50 74 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e  that error again
2fc60 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2fc70 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2fc80 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
2fc90 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50  r->errCode;..  P
2fca0 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41  AGERTRACE(("DATA
2fcb0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
2fcc0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53  %s zMaster=%s nS
2fcd0 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  ize=%d\n", .    
2fce0 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2fcf0 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  ame, zMaster, pP
2fd00 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a  ager->dbSize));.
2fd10 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  .  if( MEMDB && 
2fd20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2fd30 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ed ){.    /* If 
2fd40 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2fd50 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
2fd60 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
2fd70 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
2fd80 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
2fd90 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
2fda0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
2fdb0 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
2fdc0 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
2fdd0 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
2fde0 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
2fdf0 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
2fe00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
2fe10 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
2fe20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
2fe30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
2fe40 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
2fe50 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70 50  GER_SYNCED && pP
2fe60 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2fe70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65   ){.    if( page
2fe80 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2fe90 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
2fea0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
2feb0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2fec0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2fed0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2fee0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2fef0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
2ff00 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70  pPager, pList, p
2ff10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31  Pager->dbSize, 1
2ff20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
2ff30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2ff40 20 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f   ? pPager->sync_
2ff50 66 6c 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20  flags : 0).     
2ff60 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
2ff70 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2ff80 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
2ff90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
2ffa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2ffb0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2ffc0 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20  ock updates the 
2ffd0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
2ffe0 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20  Exactly how it. 
2fff0 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69       ** does thi
30000 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  s depends on whe
30010 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
30020 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
30030 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  timization.     
30040 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20   ** was enabled 
30050 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
30060 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61   and if this tra
30070 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74  nsaction meets t
30080 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e  he .      ** run
30090 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f  time criteria to
300a0 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69   use the operati
300b0 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  on: .      **.  
300c0 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20      **    * The 
300d0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
300e0 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  orts the atomic-
300f0 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66  write property f
30100 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  or.      **     
30110 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
30120 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a  page-size, and .
30130 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
30140 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74  is commit is not
30150 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
30160 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  -file transactio
30170 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  n, and.      ** 
30180 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65     * Exactly one
30190 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d   page has been m
301a0 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72  odified and stor
301b0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
301c0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
301d0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
301e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73  optimization was
301f0 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20   not enabled at 
30200 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
30210 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
30220 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
30230 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74  ecounter() funct
30240 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
30250 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
30260 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e  ge.      ** coun
30270 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
30280 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
30290 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
302a0 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
302b0 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61       ** is not a
302c0 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69  pplicable to thi
302d0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63  s transaction, c
302e0 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  all sqlite3Journ
302f0 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20  alCreate().     
30300 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   ** to make sure
30310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30320 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62  e has actually b
30330 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65  een created, the
30340 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  n call.      ** 
30350 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
30360 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70  ecounter() to up
30370 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d  date the change-
30380 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72  counter in indir
30390 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  ect.      ** mod
303a0 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  e. .      **.   
303b0 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
303c0 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   if the optimiza
303d0 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61  tion is both ena
303e0 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61  bled and applica
303f0 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ble,.      ** th
30400 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e  en call pager_in
30410 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
30420 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  () to update the
30430 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a   change-counter.
30440 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72        ** in 'dir
30450 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68  ect' mode. In th
30460 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
30470 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
30480 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ver be.      ** 
30490 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
304a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
304b0 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20      */.  #ifdef 
304c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
304d0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
304e0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
304f0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
30500 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
30510 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
30520 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
30530 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
30540 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74        if( !zMast
30550 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  er && isOpen(pPa
30560 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  ger->jfd) .     
30570 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
30580 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
30590 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
305a0 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65  .       && pPage
305b0 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
305c0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  r->dbFileSize.  
305d0 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67       && (0==(pPg
305e0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
305f0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
30600 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30  ->pPCache)) || 0
30610 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20  ==pPg->pDirty). 
30620 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30630 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
30640 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
30650 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72  nter via the dir
30660 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64  ect-write method
30670 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a  . The .        *
30680 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  * following call
30690 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65   will modify the
306a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65   in-memory repre
306b0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67  sentation of pag
306c0 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  e 1 .        ** 
306d0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
306e0 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f  pdated change co
306f0 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
30700 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20  rite page 1 .   
30710 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
30720 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
30730 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f   file. Because o
30740 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
30750 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  te .        ** p
30760 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
30770 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
30780 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20   this is safe.. 
30790 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
307a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
307b0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
307c0 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
307d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
307e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
307f0 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
30800 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
30810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30830 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
30840 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
30850 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
30860 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65    }.      }.  #e
30870 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70  lse.      rc = p
30880 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
30890 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
308a0 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20  0);.  #endif.   
308b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
308c0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
308d0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
308e0 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49  t;.  .      /* I
308f0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
30900 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
30910 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
30920 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
30930 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
30940 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
30950 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
30960 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
30970 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
30980 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63   ** file. This c
30990 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
309a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
309b0 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  de..      **.   
309c0 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61     ** Before rea
309d0 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77  ding the pages w
309e0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
309f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
30a00 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65   .      ** curre
30a10 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
30a20 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62  r.dbSize, set db
30a30 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  Size back to the
30a40 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20   value.      ** 
30a50 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20  that it took at 
30a60 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
30a70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74   transaction. Ot
30a80 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20  herwise, the.   
30a90 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
30aa0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
30ab0 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70   return zeroed p
30ac0 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ages instead of 
30ad0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  .      ** readin
30ae0 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  g data from the 
30af0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
30b00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30b10 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   When journal_mo
30b20 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f 72  de==OFF the dbOr
30b30 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79 73  igSize is always
30b40 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20   zero, so this. 
30b50 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65       ** block ne
30b60 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72  ver runs if jour
30b70 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20  nal_mode=OFF..  
30b80 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66      */.  #ifndef
30b90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30ba0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
30bb0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
30bc0 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  <pPager->dbOrigS
30bd0 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20 41  ize .       && A
30be0 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f  LWAYS(pPager->jo
30bf0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
30c00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
30c10 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
30c20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20     Pgno i;      
30c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c50 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
30c60 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  e */.        con
30c70 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20  st Pgno iSkip = 
30c80 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
30c90 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e  ager); /* Pendin
30ca0 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20  g lock page */. 
30cb0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e         const Pgn
30cc0 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  o dbSize = pPage
30cd0 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20  r->dbSize;      
30ce0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61   /* Database ima
30cf0 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20  ge size */ .    
30d00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
30d10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
30d20 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  rigSize;.       
30d30 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31   for( i=dbSize+1
30d40 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ; i<=pPager->dbO
30d50 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  rigSize; i++ ){.
30d60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
30d70 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
30d80 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
30d90 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
30da0 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
30db0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
30dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30dd0 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  Page to journal 
30de0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
30df0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30e00 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
30e10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
30e20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30e30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
30e40 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
30e50 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
30e60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30e70 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  rWrite(pPage);. 
30e80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30e90 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
30ea0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
30eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30ec0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
30ed0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
30ee0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
30f00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
30f10 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 20  dbSize;.      } 
30f20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20 20  .  #endif.  .   
30f30 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
30f40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
30f50 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
30f60 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20  rnal file. If a 
30f70 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a 2a  master .      **
30f80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
30f90 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
30fa0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
30fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
30fc0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 66   .      ** or if
30fd0 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c   zMaster is NULL
30fe0 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72   (no master jour
30ff0 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20  nal), then this 
31000 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
31010 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31020 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
31030 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
31040 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
31050 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31060 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
31070 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
31080 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63    .      /* Sync
31090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
310a0 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63  e. If the atomic
310b0 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
310c0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  tion is being.  
310d0 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69      ** used, thi
310e0 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  s call will not 
310f0 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  create the journ
31100 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f  al file or perfo
31110 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  rm any.      ** 
31120 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a  real IO..      *
31130 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  /.      rc = syn
31140 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
31150 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31160 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31170 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31180 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
31190 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
311a0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
311b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
311c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
311d0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
311e0 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  st(sqlite3Pcache
311f0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
31200 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20  ->pPCache));.   
31210 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31230 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
31240 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
31250 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
31260 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31270 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  e_exit;.      }.
31280 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
31290 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
312a0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
312b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
312c0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
312d0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69   not the same si
312e0 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ze as the databa
312f0 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20  se image,.      
31300 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65  ** then use page
31310 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72  r_truncate to gr
31320 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65  ow or shrink the
31330 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
31340 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
31350 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70  Pager->dbSize!=p
31360 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
31370 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  e ){.        Pgn
31380 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d  o nNew = pPager-
31390 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65  >dbSize - (pPage
313a0 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52  r->dbSize==PAGER
313b0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
313c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
313d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
313e0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
313f0 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  E );.        rc 
31400 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
31410 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a  (pPager, nNew);.
31420 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31430 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
31440 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
31450 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  e_exit;.      }.
31460 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61    .      /* Fina
31470 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61  lly, sync the da
31480 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
31490 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
314a0 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f  r->noSync && !no
314b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
314c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
314d0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
314e0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
314f0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
31500 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59    IOTRACE(("DBSY
31510 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
31520 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  )).    }..    pP
31530 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
31540 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
31550 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e  .commit_phase_on
31560 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e  e_exit:.  return
31570 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
31580 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
31590 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
315a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
315b0 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  as been complete
315c0 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f  ly.** updated to
315d0 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61   reflect the cha
315e0 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65  nges made by the
315f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
31600 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63  tion and.** sync
31610 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20  ed to disk. The 
31620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69  journal file sti
31630 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ll exists in the
31640 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
31650 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20   though, and if 
31660 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
31670 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
31680 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  t will eventuall
31690 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20  y.** be used as 
316a0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
316b0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  d the current tr
316c0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64  ansaction rolled
316d0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
316e0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c  s function final
316f0 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
31700 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79   file, either by
31710 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74   deleting, .** t
31720 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72  runcating or par
31730 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69  tially zeroing i
31740 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  t, so that it ca
31750 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a  nnot be used .**
31760 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   for hot-journal
31770 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20   rollback. Once 
31780 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65  this is done the
31790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
317a0 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63  ** irrevocably c
317b0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
317c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
317d0 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
317e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
317f0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a   and the pager.*
31800 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65  * moves into the
31810 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74   error state. Ot
31820 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
31830 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
31840 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
31850 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
31860 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
31870 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
31880 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
31890 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
318a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
318b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
318c0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
318d0 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65 72  ed if a prior er
318e0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
318f0 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64  ..  ** But if (d
31900 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
31910 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69  rror elsewhere i
31920 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69 74  n the system) it
31930 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63   does get.  ** c
31940 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75  alled, just retu
31950 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
31960 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64  r code without d
31970 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a  oing anything. *
31980 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
31990 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
319a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
319b0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54  errCode;..  /* T
319c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
319d0 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
319e0 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  d if the pager i
319f0 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73  s not in at leas
31a00 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53  t.  ** PAGER_RES
31a10 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e 64  ERVED state. And
31a20 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20 6e   indeed SQLite n
31a30 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e 20  ever does this. 
31a40 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e  But it is.  ** n
31a50 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69 73  ice to have this
31a60 20 64 65 66 65 6e 73 69 76 65 20 74 65 73 74 20   defensive test 
31a70 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  here anyway..  *
31a80 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
31a90 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
31aa0 52 5f 52 45 53 45 52 56 45 44 29 20 29 20 72 65  R_RESERVED) ) re
31ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
31ac0 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69  R;..  /* An opti
31ad0 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  mization. If the
31ae0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f   database was no
31af0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
31b00 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  ied during.  ** 
31b10 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
31b20 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  , the pager is r
31b30 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
31b40 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a  ive-mode and is.
31b50 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69    ** using persi
31b60 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  stent journals, 
31b70 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
31b80 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
31b90 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61   **.  ** The sta
31ba0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
31bb0 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
31bc0 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
31bd0 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  le journal .  **
31be0 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68 65   header with the
31bf0 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74 20   nRec field set 
31c00 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61 20  to 0. If such a 
31c10 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20  journal is used 
31c20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  as.  ** a hot-jo
31c30 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74  urnal during hot
31c40 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
31c50 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c  k, 0 changes wil
31c60 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74  l be made.  ** t
31c70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31c80 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73  ile. So there is
31c90 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f   no need to zero
31ca0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
31cb0 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65  ** header. Since
31cc0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
31cd0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
31ce0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
31cf0 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61  d.  ** to drop a
31d00 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e  ny locks either.
31d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
31d20 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d  er->dbModified==
31d30 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  0 && pPager->exc
31d40 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
31d50 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
31d60 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
31d70 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
31d80 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
31d90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
31da0 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
31db0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
31dc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
31dd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  E_OK;.  }..  PAG
31de0 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54  ERTRACE(("COMMIT
31df0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
31e00 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73  pPager)));.  ass
31e10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
31e20 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
31e30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50   || MEMDB || !pP
31e40 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
31e50 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
31e60 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
31e70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
31e80 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72  >setMaster);.  r
31e90 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
31ea0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
31eb0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
31ec0 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68   all changes. Th
31ed0 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
31ee0 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
31ef0 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  HARED mode..**.*
31f00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31f10 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73  performs two tas
31f20 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  ks:.**.**   1) I
31f30 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  t rolls back the
31f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72   journal file, r
31f50 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74  estoring all dat
31f60 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a  abase file and .
31f70 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  **      in-memor
31f80 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f  y cache pages to
31f90 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20   the state they 
31fa0 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65  were in when the
31fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
31fc0 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c       was opened,
31fd0 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20   and.**   2) It 
31fe0 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
31ff0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74  urnal file, so t
32000 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73  hat it is not us
32010 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20  ed for hot.**   
32020 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61     rollback at a
32030 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ny point in the 
32040 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75  future..**.** su
32050 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c  bject to the fol
32060 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61  lowing qualifica
32070 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49  tions:.**.** * I
32080 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
32090 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
320a0 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
320b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
320c0 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20  .**   then only 
320d0 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64  (2) is performed
320e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
320f0 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e  here is no journ
32100 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20  al file.**   to 
32110 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  roll back..**.**
32120 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f   * If in an erro
32130 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
32140 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  an SQLITE_FULL, 
32150 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73  then task (1) is
32160 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64   .**   performed
32170 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
32180 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72   task (2). Regar
32190 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
321a0 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74  come.**   of eit
321b0 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73  her, the error s
321c0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
321d0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
321e0 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28  he caller.**   (
321f0 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49  i.e. either SQLI
32200 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
32210 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
32220 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65  ** * If the page
32230 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45  r is in PAGER_RE
32240 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
32250 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
32260 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20  Whether.**   or 
32270 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 75  not (1) is succu
32280 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65  ssful, also atte
32290 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63  mpt (2). If succ
322a0 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
322b0 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  *   SQLITE_OK. O
322c0 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20  therwise, enter 
322d0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
322e0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66  and return the f
322f0 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72  irst .**   error
32300 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65   code encountere
32310 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  d. .**.**   In t
32320 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
32330 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
32340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
32350 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a  s written to. .*
32360 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74  *   So is safe t
32370 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
32380 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e  ournal file even
32390 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b   if the playback
323a0 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f   .**   (operatio
323b0 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77  n 1) failed. How
323c0 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d  ever the pager m
323d0 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72  ust enter the er
323e0 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61  ror state.**   a
323f0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
32400 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
32410 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75  cache are now su
32420 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46  spect..**.** * F
32430 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41  inally, if in PA
32440 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74  GER_EXCLUSIVE st
32450 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70  ate, then attemp
32460 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20  t (1). Only.**  
32470 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20   attempt (2) if 
32480 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75  (1) is successfu
32490 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  l. Return SQLITE
324a0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
324b0 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73  l,.**   otherwis
324c0 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  e enter the erro
324d0 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75  r state and retu
324e0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
324f0 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20  e from the .**  
32500 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69   failing operati
32510 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  on..**.**   In t
32520 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74  his case the dat
32530 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68  abase file may h
32540 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
32550 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a   to. So if the.*
32560 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  *   playback ope
32570 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73  ration did not s
32580 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20  ucceed it would 
32590 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66  not be safe to f
325a0 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65  inalize.**   the
325b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
325c0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65  t needs to be le
325d0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
325e0 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a  ystem so that.**
325f0 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72     some other pr
32600 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74  ocess can use it
32610 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
32620 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28  database state (
32630 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72  by.**   hot-jour
32640 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a  nal rollback)..*
32650 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
32660 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
32670 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
32680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
326b0 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45   */.  PAGERTRACE
326c0 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  (("ROLLBACK %d\n
326d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
326e0 72 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67 65  r)));.  if( page
326f0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32700 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
32710 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32720 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
32730 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e  pPager, SAVEPOIN
32740 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b  T_ROLLBACK, -1);
32750 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
32760 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
32770 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
32780 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20  >setMaster);.   
32790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
327a0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
327b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
327c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
327d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50  .  }else if( !pP
327e0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
327f0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
32800 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
32810 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
32820 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32830 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
32840 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
32850 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
32860 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
32870 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
32880 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
32890 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
328a0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
328b0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
328c0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
328d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
328e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
328f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
32900 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
32910 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
32920 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
32930 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
32940 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
32950 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
32960 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
32970 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
32980 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
32990 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
329a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
329b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
329c0 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
329d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
329e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
329f0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
32a00 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
32a10 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
32a20 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
32a30 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
32a40 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
32a50 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
32a60 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
32a70 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
32a80 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
32a90 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
32aa0 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
32ab0 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
32ac0 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
32ad0 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
32ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
32af0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
32b00 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
32b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32b20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
32b30 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
32b40 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
32b50 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
32b60 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
32b70 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
32b80 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
32b90 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
32ba0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
32bb0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
32bc0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
32bd0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
32be0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
32bf0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
32c00 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
32c10 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
32c20 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
32c30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32c40 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32c50 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
32c60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
32c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
32c80 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65   the approximate
32c90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32ca0 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65   of memory curre
32cb0 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20  ntly.** used by 
32cc0 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74  the pager and it
32cd0 73 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63  s associated cac
32ce0 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  he..*/.int sqlit
32cf0 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50  e3PagerMemUsed(P
32d00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
32d10 20 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65   int perPageSize
32d20 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
32d30 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  ize + pPager->nE
32d40 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74  xtra + 20;.  ret
32d50 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a  urn perPageSize*
32d60 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
32d70 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
32d80 50 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20  PCache).        
32d90 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c     + sqlite3Mall
32da0 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  ocSize(pPager);.
32db0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
32dc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
32dd0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
32de0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
32df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
32e00 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
32e10 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  DbPage *pPage){.
32e20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
32e30 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
32e40 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69  nt(pPage);.}..#i
32e50 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
32e60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
32e70 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
32e80 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
32e90 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
32ea0 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
32eb0 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
32ec0 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
32ed0 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
32ee0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
32ef0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
32f00 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d  pPCache);.  a[1]
32f10 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
32f20 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
32f30 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
32f40 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  2] = sqlite3Pcac
32f50 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70  heGetCachesize(p
32f60 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
32f70 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
32f80 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20  ->dbSizeValid ? 
32f90 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62  (int) pPager->db
32fa0 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34  Size : -1;.  a[4
32fb0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
32fc0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
32fd0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
32fe0 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
32ff0 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
33000 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
33010 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
33020 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
33030 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
33040 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
33050 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
33060 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
33070 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
33080 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
33090 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
330a0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
330b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
330c0 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65  agerIsMemdb(Page
330d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
330e0 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f  turn MEMDB;.}../
330f0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
33100 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61  there are at lea
33110 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61  st nSavepoint sa
33120 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49  vepoints open. I
33130 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63  f there are.** c
33140 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68  urrently less th
33150 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f  an nSavepoints o
33160 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f  pen, then open o
33170 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
33180 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65  oints.** to make
33190 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e   up the differen
331a0 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65  ce. If the numbe
331b0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
331c0 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71  is already.** eq
331d0 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e  ual to nSavepoin
331e0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
331f0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
33200 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
33210 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
33220 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
33230 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
33240 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  If an error .** 
33250 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
33260 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75  ning the sub-jou
33270 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
33280 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
33290 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
332a0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
332b0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
332c0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
332d0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
332e0 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65  Pager, int nSave
332f0 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
33300 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
33310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33320 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
33330 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  de */.  int nCur
33340 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  rent = pPager->n
33350 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
33360 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
33370 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
33380 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76  s */..  if( nSav
33390 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20  epoint>nCurrent 
333a0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
333b0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
333c0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
333d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333e0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
333f0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
33400 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
33410 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *aNew;          
33420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
33430 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
33440 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
33450 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
33460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33470 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
33480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
33490 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  /..    rc = sqli
334a0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
334b0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
334c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
334d0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
334e0 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65  /* Grow the Page
334f0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
33500 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63  ay using realloc
33510 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  (). Return SQLIT
33520 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69  E_NOMEM.    ** i
33530 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
33540 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73   fails. Otherwis
33550 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20  e, zero the new 
33560 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20  portion in case 
33570 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63  a .    ** malloc
33580 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
33590 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
335a0 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e   it in the for(.
335b0 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a  ..) loop below..
335c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20      */.    aNew 
335d0 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  = (PagerSavepoin
335e0 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  t *)sqlite3Reall
335f0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  oc(.        pPag
33600 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20  er->aSavepoint, 
33610 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
33620 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e  point)*nSavepoin
33630 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
33640 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
33650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
33660 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
33670 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72  emset(&aNew[nCur
33680 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65  rent], 0, (nSave
33690 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20  point-nCurrent) 
336a0 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  * sizeof(PagerSa
336b0 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70  vepoint));.    p
336c0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
336d0 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50  t = aNew;.    pP
336e0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
336f0 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a   = nSavepoint;..
33700 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
33710 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
33720 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
33730 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
33740 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72  .    for(ii=nCur
33750 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f  rent; ii<nSavepo
33760 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
33770 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67    aNew[ii].nOrig
33780 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
33790 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
337a0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
337b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
337c0 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  ){.        aNew[
337d0 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50  ii].iOffset = pP
337e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
337f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33800 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
33810 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41  iOffset = JOURNA
33820 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
33830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33840 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63  aNew[ii].iSubRec
33850 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
33860 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69  ec;.      aNew[i
33870 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
33880 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
33890 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20  reate(nPage);.  
338a0 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69      if( !aNew[ii
338b0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29  ].pInSavepoint )
338c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
338d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
338e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
338f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33900 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
33910 61 4e 65 77 5b 69 69 5d 2e 69 46 72 61 6d 65 20  aNew[ii].iFrame 
33920 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65  = sqlite3WalSave
33930 70 6f 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 57  point(pPager->pW
33940 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  al);.      }.   
33950 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   }..    /* Open 
33960 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
33970 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
33980 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  ready opened. */
33990 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
339a0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
339b0 3b 0a 20 20 20 20 61 73 73 65 72 74 54 72 75 6e  ;.    assertTrun
339c0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
339d0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
339e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
339f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33a00 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
33a10 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
33a20 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
33a30 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
33a40 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
33a50 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
33a60 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
33a70 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
33a80 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
33a90 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
33aa0 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
33ab0 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
33ac0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
33ad0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
33ae0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
33af0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
33b00 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
33b10 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
33b20 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
33b30 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
33b40 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
33b50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
33b60 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
33b70 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
33b80 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
33b90 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
33ba0 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
33bb0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
33bc0 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
33bd0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
33be0 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
33bf0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
33c00 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
33c10 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
33c20 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
33c30 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
33c40 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
33c50 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
33c60 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
33c70 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
33c80 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
33c90 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
33ca0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
33cb0 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
33cc0 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
33cd0 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
33ce0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
33cf0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
33d00 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
33d10 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
33d20 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
33d30 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
33d40 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
33d50 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
33d60 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
33d70 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
33d80 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
33d90 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
33da0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
33db0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
33dc0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
33dd0 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
33de0 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
33df0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
33e00 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
33e10 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
33e20 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
33e30 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
33e40 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
33e50 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
33e60 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
33e70 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
33e80 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
33e90 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
33ea0 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
33eb0 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
33ec0 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
33ed0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
33ee0 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
33ef0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
33f00 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
33f10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
33f20 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
33f30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
33f40 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
33f50 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
33f60 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
33f70 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
33f80 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
33f90 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
33fa0 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
33fb0 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
33fc0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
33fd0 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
33fe0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
33ff0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
34000 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
34010 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
34020 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34030 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
34040 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34050 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
34060 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
34070 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
34080 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
34090 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
340a0 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
340b0 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
340c0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
340d0 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
340e0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
340f0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
34100 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
34110 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
34120 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
34130 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
34140 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
34150 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
34160 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
34170 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
34180 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
34190 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
341a0 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
341b0 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
341c0 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
341d0 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
341e0 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
341f0 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
34200 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
34210 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
34220 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
34230 65 70 6f 69 6e 74 20 2b 20 28 28 20 6f 70 3d 3d  epoint + (( op==
34240 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34250 45 20 29 20 3f 20 30 20 3a 20 31 29 3b 0a 20 20  E ) ? 0 : 1);.  
34260 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69    for(ii=nNew; i
34270 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
34280 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
34290 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
342a0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
342b0 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
342c0 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
342d0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
342e0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65  nSavepoint = nNe
342f0 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  w;..    /* If th
34300 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
34310 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
34320 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e   savepoint, trun
34330 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  cate .    ** the
34340 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   sub-journal to 
34350 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
34360 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ze. */.    if( o
34370 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
34380 45 41 53 45 20 29 7b 0a 20 20 20 20 20 20 69 66  EASE ){.      if
34390 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 69 73 4f  ( nNew==0 && isO
343a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
343b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
343c0 4f 6e 6c 79 20 74 72 75 6e 63 61 74 65 20 69 66  Only truncate if
343d0 20 69 74 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d   it is an in-mem
343e0 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  ory sub-journal.
343f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
34400 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
34410 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
34420 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
34430 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
34440 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  ncate(pPager->sj
34450 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
34460 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34470 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
34480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
34490 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
344a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
344b0 20 20 20 20 2f 2a 20 45 6c 73 65 20 74 68 69 73      /* Else this
344c0 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
344d0 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62 61  peration, playba
344e0 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ck the specified
344f0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20 20   savepoint..    
34500 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
34510 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69 73  temp-file, it is
34520 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74   possible that t
34530 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
34540 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 79  has.    ** not y
34550 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 20  et been opened. 
34560 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34570 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
34580 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20 2a  changes to.    *
34590 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
345a0 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61 79  ile, so the play
345b0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 63  back operation c
345c0 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
345d0 20 20 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69     */.    else i
345e0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
345f0 50 61 67 65 72 29 20 7c 7c 20 69 73 4f 70 65 6e  Pager) || isOpen
34600 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
34610 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
34620 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
34630 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
34640 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
34650 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
34660 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
34670 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
34680 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
34690 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
346a0 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
346b0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a  );.    }.  .  }.
346c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
346d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
346e0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
346f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34700 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
34710 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
34720 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
34730 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
34740 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
34750 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
34760 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
34770 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
34780 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
34790 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
347a0 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
347b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
347c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
347d0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
347e0 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
347f0 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
34800 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
34810 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
34820 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
34830 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
34840 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
34850 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
34860 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
34870 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
34880 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
34890 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
348a0 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
348b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
348c0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
348d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
348e0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
348f0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
34900 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
34910 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
34920 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
34930 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
34940 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
34950 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
34960 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
34970 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
34980 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
34990 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
349a0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
349b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
349c0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
349d0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
349e0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
349f0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
34a00 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
34a10 2a 20 53 65 74 20 6f 72 20 72 65 74 72 69 65 76  * Set or retriev
34a20 65 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  e the codec for 
34a30 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74  this pager.*/.st
34a40 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
34a50 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
34a60 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
34a70 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
34a80 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
34a90 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
34aa0 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
34ab0 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
34ac0 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
34ad0 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a  ecFree)(void*),.
34ae0 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29    void *pCodec.)
34af0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
34b00 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
34b10 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
34b20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
34b30 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
34b40 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  c = pPager->memD
34b50 62 20 3f 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a  b ? 0 : xCodec;.
34b60 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
34b70 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64 65  SizeChng = xCode
34b80 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61  cSizeChng;.  pPa
34b90 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
34ba0 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20 20  = xCodecFree;.  
34bb0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d  pPager->pCodec =
34bc0 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65 72   pCodec;.  pager
34bd0 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
34be0 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  r);.}.static voi
34bf0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
34c00 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a 70  etCodec(Pager *p
34c10 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
34c20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b   pPager->pCodec;
34c30 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
34c40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34c50 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
34c60 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
34c70 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
34c80 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  no in the file..
34c90 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
34ca0 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
34cb0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 72  s to the page pr
34cc0 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64  eviously located
34cd0 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69   at.** pgno (whi
34ce0 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c  ch we call pPgOl
34cf0 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20 70  d) though that p
34d00 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  age is allowed t
34d10 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65  o be.** in cache
34d20 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 70  .  If the page p
34d30 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
34d40 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74  d at pgno is not
34d50 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74   already.** in t
34d60 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
34d70 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  nal, it is not p
34d80 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74  ut there by by t
34d90 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
34da0 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
34db0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65   the page pPg re
34dc0 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
34dd0 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
34de0 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
34df0 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20   with pPg (i.e. 
34e00 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
34e10 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
34e20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
34e30 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
34e40 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
34e50 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
34e60 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
34e70 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
34e80 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
34e90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
34ea0 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
34eb0 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
34ec0 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
34ed0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
34ee0 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
34ef0 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
34f00 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
34f10 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
34f20 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
34f30 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
34f40 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
34f50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
34f60 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ive)..**.** If t
34f70 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
34f80 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73  nt, isCommit, is
34f90 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
34fa0 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65 69  this page is bei
34fb0 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70  ng.** moved as p
34fc0 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  art of a databas
34fd0 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e  e reorganization
34fe0 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   just before the
34ff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
35000 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
35010 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
35020 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  e, it is guarant
35030 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61 74  eed that the dat
35040 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20 70  abase page .** p
35050 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69 6c  Pg refers to wil
35060 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
35070 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69 6e   to again within
35080 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
35090 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  n..**.** This fu
350a0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
350b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  n SQLITE_NOMEM o
350c0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
350d0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
350e0 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72 77  * occurs. Otherw
350f0 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ise, it returns 
35100 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
35110 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
35120 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
35130 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
35140 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e  g, Pgno pgno, in
35150 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  t isCommit){.  P
35160 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20  gHdr *pPgOld;   
35170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
35180 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
35190 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
351a0 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
351b0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  o = 0;       /* 
351c0 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50 67  Old value of pPg
351d0 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20  ->pgno, if sync 
351e0 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  is required */. 
351f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
35200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35210 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35220 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b    Pgno origPgno;
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35240 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  * The original p
35250 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20  age number */.. 
35260 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
35270 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ef>0 );..  /* In
35280 20 6f 72 64 65 72 20 74 6f 20 62 65 20 61 62 6c   order to be abl
35290 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  e to rollback, a
352a0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
352b0 62 61 73 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61  base must journa
352c0 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  l.  ** the page 
352d0 77 65 20 61 72 65 20 6d 6f 76 69 6e 67 20 66 72  we are moving fr
352e0 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  om..  */.  if( M
352f0 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d  EMDB ){.    rc =
35300 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
35310 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
35320 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
35330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
35340 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76  e page being mov
35350 65 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20  ed is dirty and 
35360 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76  has not been sav
35370 65 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74  ed by the latest
35380 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c  .  ** savepoint,
35390 20 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63   then save the c
353a0 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
353b0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  of the page into
353c0 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
353d0 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73  ournal now. This
353e0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
353f0 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f  handle the follo
35400 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20  wing scenario:. 
35410 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
35420 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
35430 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e  nal page X, then
35440 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65   modify it in me
35450 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53  mory>.  **     S
35460 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20  AVEPOINT one;.  
35470 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70  **       <Move p
35480 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f  age X to locatio
35490 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f  n Y>.  **     RO
354a0 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20  LLBACK TO one;. 
354b0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65   **.  ** If page
354c0 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74   X were not writ
354d0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
354e0 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20  ournal here, it 
354f0 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  would not.  ** b
35500 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  e possible to re
35510 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e  store its conten
35520 74 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ts when the "ROL
35530 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20  LBACK TO one".  
35540 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72  ** statement wer
35550 65 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a  e is processed..
35560 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75    **.  ** subjou
35570 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e  rnalPage() may n
35580 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  eed to allocate 
35590 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70  space to store p
355a0 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20  Pg->pgno into.  
355b0 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ** one or more s
355c0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
355d0 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65  . This is the re
355e0 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ason this functi
355f0 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  on.  ** may retu
35600 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
35610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
35620 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
35630 54 59 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  TY.   && subjReq
35640 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
35650 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
35660 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
35670 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
35680 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
35690 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
356a0 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
356b0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
356c0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
356d0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
356e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
356f0 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
35700 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
35710 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
35720 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
35730 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
35740 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
35750 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
35760 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
35770 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
35780 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
35790 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
357a0 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
357b0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
357c0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
357d0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
357e0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
357f0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
35800 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
35810 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
35820 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
35830 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
35840 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
35850 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
35860 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
35870 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
35880 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
35890 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
358a0 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
358b0 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
358c0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
358d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
358e0 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
358f0 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
35900 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
35910 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
35920 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
35930 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
35940 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
35950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
35960 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
35970 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
35980 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
35990 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
359a0 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
359b0 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
359c0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
359d0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
359e0 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
359f0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
35a00 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
35a10 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
35a20 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
35a30 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
35a40 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
35a50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
35a60 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
35a70 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
35a80 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
35a90 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
35aa0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
35ab0 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
35ac0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
35ad0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
35ae0 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
35af0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
35b00 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
35b10 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
35b20 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
35b30 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
35b40 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
35b50 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
35b60 64 69 73 63 61 72 64 20 70 61 67 65 73 20 66 72  discard pages fr
35b70 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
35b80 64 61 74 61 62 61 73 65 20 73 69 6e 63 65 20 77  database since w
35b90 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
35ba0 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
35bb0 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73 74 20 6d  k later.  Just m
35bc0 6f 76 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ove the page out
35bd0 20 6f 66 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a   of the way. */.
35be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
35bf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
35c00 64 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d );.      sqlit
35c10 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
35c20 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  Old, pPager->dbS
35c30 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ize+1);.    }els
35c40 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
35c50 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c  PcacheDrop(pPgOl
35c60 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
35c70 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d   origPgno = pPg-
35c80 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  >pgno;.  sqlite3
35c90 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
35ca0 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  pgno);.  sqlite3
35cb0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
35cc0 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
35cd0 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
35ce0 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
35cf0 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
35d00 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
35d10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
35d20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35d30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
35d40 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
35d50 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
35d60 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
35d70 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
35d80 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
35d90 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
35da0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
35db0 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
35dc0 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
35dd0 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
35de0 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
35df0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
35e00 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
35e10 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
35e20 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
35e30 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
35e40 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
35e50 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
35e60 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
35e70 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
35e80 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
35e90 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
35ea0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
35eb0 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
35ec0 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
35ed0 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
35ee0 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
35ef0 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
35f00 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
35f10 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
35f20 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
35f30 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
35f40 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
35f50 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
35f60 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
35f70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
35f80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
35f90 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
35fa0 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
35fb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
35fc0 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
35fd0 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
35fe0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
35ff0 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
36000 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
36010 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
36020 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
36030 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
36040 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
36050 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
36060 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
36070 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
36080 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
36090 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
360a0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
360b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
360c0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
360d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
360e0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
360f0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
36100 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
36110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36120 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 53  .      if( needS
36130 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
36140 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
36150 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
36160 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
36170 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
36180 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61  qlite3BitvecClea
36190 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  r(pPager->pInJou
361a0 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67  rnal, needSyncPg
361b0 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  no, pPager->pTmp
361c0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Space);.      }.
361d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
361e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
361f0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
36200 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36210 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
36220 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  & !MEMDB );.    
36230 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d  pPgHdr->flags |=
36240 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
36250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
36260 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
36270 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
36280 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
36290 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dr);.  }..  /*. 
362a0 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65   ** For an in-me
362b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d  mory database, m
362c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69  ake sure the ori
362d0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69  ginal page conti
362e0 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69  nues.  ** to exi
362f0 73 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  st, in case the 
36300 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
36310 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  s to roll back. 
36320 20 55 73 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a   Use pPgOld.  **
36330 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
36340 20 70 61 67 65 20 73 69 6e 63 65 20 69 74 20 68   page since it h
36350 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
36360 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a  allocated..  */.
36370 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
36380 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
36390 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69  Move(pPgOld, ori
363a0 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69  gPgno);.    sqli
363b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
363c0 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  gOld);.  }..  re
363d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
363e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
363f0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
36400 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
36410 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
36420 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
36430 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
36440 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
36450 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
36460 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
36470 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
36480 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
36490 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
364a0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
364b0 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
364c0 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
364d0 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
364e0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
364f0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
36500 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
36510 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
36520 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
36530 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
36540 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExtra;.}../*.**
36550 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
36560 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
36570 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
36580 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
36590 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
365a0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
365b0 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
365c0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
365d0 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
365e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
365f0 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
36600 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
36610 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
36620 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
36630 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
36640 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
36650 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
36660 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
36670 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
36680 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
36690 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
366a0 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
366b0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
366c0 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
366d0 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
366e0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
366f0 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
36700 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
36710 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
36720 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
36730 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
36740 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
36750 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
36760 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
36770 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
36780 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
36790 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
367a0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
367b0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
367c0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
367d0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
367e0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
367f0 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
36800 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
36810 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
36820 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
36830 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
36840 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
36850 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
36860 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
36870 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
36880 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36890 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
368a0 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
368b0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
368c0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
368d0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
368e0 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  e of:.**.**    P
368f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36900 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47  _QUERY.**    PAG
36910 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
36920 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
36930 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
36940 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
36950 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
36960 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
36970 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
36980 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
36990 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
369a0 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  Y.**    PAGER_JO
369b0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 0a 2a 2a  URNALMODE_WAL.**
369c0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d  .** If the param
369d0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
369e0 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  RY, then the jou
369f0 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74  rnal_mode is set
36a00 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   to the.** value
36a10 20 73 70 65 63 69 66 69 65 64 20 69 66 20 74 68   specified if th
36a20 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f  e change is allo
36a30 77 65 64 2e 20 54 68 65 20 63 68 61 6e 67 65 20  wed. The change 
36a40 6d 61 79 20 62 65 20 64 69 73 61 6c 6c 6f 77 65  may be disallowe
36a50 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c  d.** for the fol
36a60 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a  lowing reasons:.
36a70 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e  **.**   *  An in
36a80 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
36a90 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69   can only have i
36aa0 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ts journal_mode 
36ab0 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20  set to _OFF.**  
36ac0 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a      or _MEMORY..
36ad0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a  **.**   *  The j
36ae0 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20  ournal mode may 
36af0 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77  not be changed w
36b00 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69  hile a transacti
36b10 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
36b20 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
36b30 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
36b40 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
36b50 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c  updated) journal
36b60 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
36b70 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
36b80 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
36b90 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
36ba0 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
36bb0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
36bc0 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
36bd0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
36be0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36bf0 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
36c00 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
36c10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
36c20 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
36c30 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
36c40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36c50 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
36c60 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
36c70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36c80 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
36c90 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
36ca0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
36cb0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL .            
36cc0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
36cd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
36ce0 52 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RY );.  assert( 
36cf0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
36d00 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 0a 20 20  E_QUERY<0 );..  
36d10 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  if( eMode==PAGER
36d20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
36d30 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
36d40 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
36d50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
36d60 45 4c 45 54 45 0a 20 20 29 7b 0a 20 20 20 20 70  ELETE.  ){.    p
36d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
36d80 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
36d90 41 4c 4d 4f 44 45 5f 57 41 4c 3b 0a 20 20 7d 65  ALMODE_WAL;.  }e
36da0 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  lse if( eMode>=0
36db0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
36dc0 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 65  tempFile==0 || e
36dd0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
36de0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
36df0 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d  && (!MEMDB || eM
36e00 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
36e10 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 7c 7c 65  ALMODE_MEMORY||e
36e20 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
36e30 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20  NALMODE_OFF).   
36e40 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  && !pPager->dbMo
36e50 64 69 66 69 65 64 0a 20 20 20 26 26 20 28 21 69  dified.   && (!i
36e60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
36e70 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d  d) || 0==pPager-
36e80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29  >journalOff).  )
36e90 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  {.    if( isOpen
36ea0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
36eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
36ec0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
36ed0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  d);.    }.    as
36ee0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
36ef0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
36f00 45 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20 20 20  E & 1)==1 );.   
36f10 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
36f20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
36f30 49 53 54 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20  IST & 1)==1 );. 
36f40 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
36f50 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
36f60 4c 45 54 45 20 26 20 31 29 3d 3d 30 20 29 3b 0a  LETE & 1)==0 );.
36f70 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
36f80 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
36f90 45 4d 4f 52 59 20 26 20 31 29 3d 3d 30 20 29 3b  EMORY & 1)==0 );
36fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
36fb0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36fc0 4f 46 46 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20  OFF & 1)==0 );. 
36fd0 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
36fe0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 31 29  journalMode & 1)
36ff0 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26 20  ==1 && (eMode & 
37000 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  1)==0.         &
37010 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  & !pPager->exclu
37020 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
37030 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
37040 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
37050 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
37060 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
37070 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37080 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
37090 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
370a0 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
370b0 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
370c0 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
370d0 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
370e0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
370f0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
37100 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
37110 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
37120 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
37130 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
37140 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
37150 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
37160 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
37170 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
37180 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
37190 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
371a0 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
371b0 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
371c0 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
371d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
371e0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
371f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
37200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
37210 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
37220 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
37230 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
37240 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
37250 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
37260 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
37270 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
37280 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
37290 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
372a0 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
372b0 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
372c0 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
372d0 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
372e0 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
372f0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
37300 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
37310 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
37320 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
37330 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
37340 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72    return &pPager
37350 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 69  ->pBackup;.}..#i
37360 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37370 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_WAL./*.** This
37380 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
37390 6c 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  led when the use
373a0 72 20 69 6e 76 6f 6b 65 73 20 22 50 52 41 47 4d  r invokes "PRAGM
373b0 41 20 63 68 65 63 6b 70 6f 69 6e 74 22 2e 0a 2a  A checkpoint"..*
373c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
373d0 65 72 43 68 65 63 6b 70 6f 69 6e 74 28 50 61 67  erCheckpoint(Pag
373e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
373f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37400 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
37410 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 75 38 20  >pWal ){.    u8 
37420 2a 7a 42 75 66 20 3d 20 28 75 38 20 2a 29 70 50  *zBuf = (u8 *)pP
37430 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
37440 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37450 33 57 61 6c 43 68 65 63 6b 70 6f 69 6e 74 28 70  3WalCheckpoint(p
37460 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
37470 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
37480 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e    (pPager->noSyn
37490 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e  c ? 0 : pPager->
374a0 73 79 6e 63 5f 66 6c 61 67 73 29 2c 0a 20 20 20  sync_flags),.   
374b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
374c0 65 53 69 7a 65 2c 20 7a 42 75 66 2c 20 0a 20 20  eSize, zBuf, .  
374d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 42        pPager->xB
374e0 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 50 61 67  usyHandler, pPag
374f0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
37500 41 72 67 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  Arg.    );.  }. 
37510 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
37520 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
37530 61 6c 43 61 6c 6c 62 61 63 6b 28 50 61 67 65 72  alCallback(Pager
37540 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
37550 75 72 6e 20 73 71 6c 69 74 65 33 57 61 6c 43 61  urn sqlite3WalCa
37560 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 2d 3e 70  llback(pPager->p
37570 57 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  Wal);.}../*.** O
37580 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  pen a connection
37590 20 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68   to the write-ah
375a0 65 61 64 20 6c 6f 67 20 66 69 6c 65 20 66 6f 72  ead log file for
375b0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 49   pager pPager. I
375c0 66 0a 2a 2a 20 74 68 65 20 6c 6f 67 20 63 6f 6e  f.** the log con
375d0 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  nection is alrea
375e0 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 66 75  dy open, this fu
375f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
37600 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  p..**.** The cal
37610 6c 65 72 20 6d 75 73 74 20 62 65 20 68 6f 6c 64  ler must be hold
37620 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
37630 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
37640 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 0a 2a  e file to call.*
37650 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  * this function.
37660 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
37670 61 67 65 72 4f 70 65 6e 57 61 6c 28 50 61 67 65  agerOpenWal(Page
37680 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
37690 70 69 73 4f 70 65 6e 29 7b 0a 20 20 69 6e 74 20  pisOpen){.  int 
376a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
376b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
376c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
376d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
376e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
376f0 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70  ARED );.  if( !p
37700 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 0a  Pager->pWal ){..
37710 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
37720 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
37730 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 74  e log file. If t
37740 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  his operation fa
37750 69 6c 73 2c 20 0a 20 20 20 20 2a 2a 20 28 65 2e  ils, .    ** (e.
37760 67 2e 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  g. due to malloc
37770 28 29 20 66 61 69 6c 75 72 65 29 2c 20 75 6e 6c  () failure), unl
37780 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
37790 20 66 69 6c 65 20 61 6e 64 20 0a 20 20 20 20 2a   file and .    *
377a0 2a 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * return an erro
377b0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
377c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
377d0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  alOpen(pPager->p
377e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
377f0 6c 65 6e 61 6d 65 2c 20 26 70 50 61 67 65 72 2d  lename, &pPager-
37800 3e 70 57 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  >pWal);.    if( 
37810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37820 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
37830 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
37840 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
37850 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  AL;.    }.  }els
37860 65 7b 0a 20 20 20 20 2a 70 69 73 4f 70 65 6e 20  e{.    *pisOpen 
37870 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 1;.  }..  retu
37880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37890 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
378a0 20 63 61 6c 6c 65 64 20 74 6f 20 63 6c 6f 73 65   called to close
378b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
378c0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
378d0 70 72 69 6f 72 0a 2a 2a 20 74 6f 20 73 77 69 74  prior.** to swit
378e0 63 68 69 6e 67 20 66 72 6f 6d 20 57 41 4c 20 74  ching from WAL t
378f0 6f 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2e  o rollback mode.
37900 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 63 6c  .**.** Before cl
37910 6f 73 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  osing the log fi
37920 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
37930 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74 61  n attempts to ta
37940 6b 65 20 61 6e 20 0a 2a 2a 20 45 58 43 4c 55 53  ke an .** EXCLUS
37950 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
37960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
37970 66 20 74 68 69 73 20 63 61 6e 6e 6f 74 20 62 65  f this cannot be
37980 20 6f 62 74 61 69 6e 65 64 2c 20 61 6e 0a 2a 2a   obtained, an.**
37990 20 65 72 72 6f 72 20 28 53 51 4c 49 54 45 5f 42   error (SQLITE_B
379a0 55 53 59 29 20 69 73 20 72 65 74 75 72 6e 65 64  USY) is returned
379b0 20 61 6e 64 20 74 68 65 20 6c 6f 67 20 63 6f 6e   and the log con
379c0 6e 65 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  nection is not c
379d0 6c 6f 73 65 64 2e 0a 2a 2a 20 49 66 20 73 75 63  losed..** If suc
379e0 63 65 73 73 66 75 6c 2c 20 74 68 65 20 45 58 43  cessful, the EXC
379f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6e  LUSIVE lock is n
37a00 6f 74 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  ot released befo
37a10 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
37a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37a30 72 43 6c 6f 73 65 57 61 6c 28 50 61 67 65 72 20  rCloseWal(Pager 
37a40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
37a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37a60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37a70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
37a80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37a90 45 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 49  E_WAL );..  /* I
37aa0 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
37ab0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
37ac0 65 6e 2c 20 62 75 74 20 64 6f 65 73 20 65 78 69  en, but does exi
37ad0 73 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  st in the file-s
37ae0 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 69 74 20 6d  ystem,.  ** it m
37af0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  ay need to be ch
37b00 65 63 6b 70 6f 69 6e 74 65 64 20 62 65 66 6f 72  eckpointed befor
37b10 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
37b20 20 63 61 6e 20 73 77 69 74 63 68 20 74 6f 0a 20   can switch to. 
37b30 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64   ** rollback mod
37b40 65 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 73  e. Open it now s
37b50 6f 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  o this can happe
37b60 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  n..  */.  if( !p
37b70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a 20  Pager->pWal ){. 
37b80 20 20 20 69 6e 74 20 6c 6f 67 65 78 69 73 74 73     int logexists
37b90 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
37ba0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
37bb0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
37bc0 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20  LOCK_SHARED);.  
37bd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
37bf0 3d 20 70 61 67 65 72 48 61 73 57 41 4c 28 70 50  = pagerHasWAL(pP
37c00 61 67 65 72 2c 20 26 6c 6f 67 65 78 69 73 74 73  ager, &logexists
37c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
37c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
37c30 26 20 6c 6f 67 65 78 69 73 74 73 20 29 7b 0a 20  & logexists ){. 
37c40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37c50 33 57 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  3WalOpen(pPager-
37c60 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
37c70 46 69 6c 65 6e 61 6d 65 2c 20 26 70 50 61 67 65  Filename, &pPage
37c80 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 0a  r->pWal);.    }.
37c90 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 43 68    }.    .  /* Ch
37ca0 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 63 6c 6f  eckpoint and clo
37cb0 73 65 20 74 68 65 20 6c 6f 67 2e 20 42 65 63 61  se the log. Beca
37cc0 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
37cd0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
37ce0 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
37cf0 73 65 20 66 69 6c 65 2c 20 74 68 65 20 6c 6f 67  se file, the log
37d00 20 61 6e 64 20 6c 6f 67 2d 73 75 6d 6d 61 72 79   and log-summary
37d10 20 66 69 6c 65 73 20 77 69 6c 6c 20 62 65 20 64   files will be d
37d20 65 6c 65 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eleted..  */.  i
37d30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37d40 20 26 26 20 70 50 61 67 65 72 2d 3e 70 57 61 6c   && pPager->pWal
37d50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
37d60 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
37d70 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  r->fd, SQLITE_LO
37d80 43 4b 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  CK_EXCLUSIVE);. 
37d90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
37db0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f   = sqlite3WalClo
37dc0 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  se(pPager->pWal,
37dd0 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20   pPager->fd,.   
37de0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f       (pPager->no
37df0 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65  Sync ? 0 : pPage
37e00 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20  r->sync_flags), 
37e10 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
37e20 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
37e30 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
37e40 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
37e50 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
37e60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
37e70 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
37e80 6e 6f 74 20 67 65 74 20 61 6e 20 45 58 43 4c 55  not get an EXCLU
37e90 53 49 56 45 20 6c 6f 63 6b 2c 20 64 6f 77 6e 67  SIVE lock, downg
37ea0 72 61 64 65 20 74 68 65 20 50 45 4e 44 49 4e 47  rade the PENDING
37eb0 20 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2a 20 74   lock.      ** t
37ec0 68 61 74 20 77 65 20 64 69 64 20 67 65 74 20 62  hat we did get b
37ed0 61 63 6b 20 74 6f 20 53 48 41 52 45 44 2e 20 2a  ack to SHARED. *
37ee0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
37ef0 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
37f00 66 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  fd, SQLITE_LOCK_
37f10 53 48 41 52 45 44 29 3b 0a 20 20 20 20 7d 0a 20  SHARED);.    }. 
37f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37f30 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
37f40 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
37f50 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.