/ Hex Artifact Content
Login

Artifact 05bd0bd2a665c8e4d4754ac3e476f1e05ee1961c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c  *.** doNotSpill,
35d0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a   doNotSyncSpill.
35e0: 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61  **.**   When ena
35f0: 62 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c  bled, cache spil
3600: 6c 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ls are prohibite
3610: 64 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69  d.  The doNotSpi
3620: 6c 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ll variable.**  
3630: 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
3640: 63 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f  che spill and do
3650: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68  NotSyncSpill inh
3660: 69 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c  ibits those spil
3670: 6c 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75  ls that.**   wou
3680: 6c 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ld require a jou
3690: 72 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20  rnal sync.  The 
36a0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69  doNotSyncSpill i
36b0: 73 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65  s set and cleare
36c0: 64 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74  d .**   by sqlit
36d0: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
36e0: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
36f0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
3700: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
3710: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
3720: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
3730: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
3740: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
3750: 72 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e  r.  The.**   doN
3760: 6f 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65  otSpill value se
3770: 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67  t to prevent pag
3780: 65 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20  erStress() from 
3790: 74 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a  trying to use.**
37a0: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64     the journal d
37b0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
37c0: 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63  ..**.** needSync
37d0: 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49  .**.**   TODO: I
37e0: 74 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65  t might be easie
37f0: 72 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61  r to set this va
3800: 72 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a  riable in writeJ
3810: 6f 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20  ournalHdr().**  
3820: 20 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72   and writeMaster
3830: 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20  Journal() only. 
3840: 43 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69  Change its meani
3850: 6e 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20  ng to "unsynced 
3860: 64 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65  data.**   has be
3870: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
3880: 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a  e journal"..**.*
3890: 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a  * subjInMemory.*
38a0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61  *.**   This is a
38b0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
38c0: 65 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e  e. If true, then
38d0: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75   any required su
38e0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69  b-journal.**   i
38f0: 73 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  s opened as an i
3900: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
3910: 20 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c   file. If false,
3920: 20 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a   then in-memory.
3930: 2a 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  **   sub-journal
3940: 73 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  s are only used 
3950: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  for in-memory pa
3960: 67 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74  ger files..*/.st
3970: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
3980: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
3990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
39a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
39b0: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
39c0: 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20   exclusiveMode; 
39d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f            /* Boo
39e0: 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f  lean. True if lo
39f0: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c  cking_mode==EXCL
3a00: 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f  USIVE */.  u8 jo
3a10: 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  urnalMode;      
3a20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20         /* On of 
3a30: 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  the PAGER_JOURNA
3a40: 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a  LMODE_* values *
3a50: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
3a60: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3a70: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
3a80: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
3a90: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
3aa0: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3ac0: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
3ad0: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
3ae0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b00: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3b10: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3b20: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3b30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3b40: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3b50: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3b60: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3b70: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3b80: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3b90: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3ba0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3bb0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65  _FULL */.  u8 te
3bc0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
3bd0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
3be0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
3bf0: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
3c00: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
3c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3c20: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
3c30: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
3c40: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
3c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3c60: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
3c70: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
3c80: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
3c90: 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73  g block contains
3ca0: 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d   those class mem
3cb0: 62 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79  bers that are dy
3cc0: 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d  namically.  ** m
3cd0: 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e  odified during n
3ce0: 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73  ormal operations
3cf0: 2e 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69  . The other vari
3d00: 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74  ables in this st
3d10: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65  ructure.  ** are
3d20: 20 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74   either constant
3d30: 20 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   throughout the 
3d40: 6c 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20  lifetime of the 
3d50: 70 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20  pager, or else. 
3d60: 20 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72   ** used to stor
3d70: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
3d80: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
3d90: 61 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74  affect the way t
3da0: 68 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f  he pager .  ** o
3db0: 70 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20  perates..  **.  
3dc0: 2a 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76  ** The 'state' v
3dd0: 61 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72  ariable is descr
3de0: 69 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74  ibed in more det
3df0: 61 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ail along with t
3e00: 68 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  he.  ** descript
3e10: 69 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75  ions of the valu
3e20: 65 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d  es it may take -
3e30: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74   PAGER_UNLOCK et
3e40: 63 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20  c. Many of the. 
3e50: 20 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62   ** other variab
3e60: 6c 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  les in this bloc
3e70: 6b 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  k are described 
3e80: 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64  in the comment d
3e90: 69 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62  irectly .  ** ab
3ea0: 6f 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64  ove this class d
3eb0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  efinition..  */.
3ec0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3ee0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3ef0: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3f00: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3f10: 64 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20  dbModified;     
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3f30: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
3f40: 79 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  y changes to the
3f50: 20 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64   Db */.  u8 need
3f60: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
3f70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3f80: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
3f90: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
3fa0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  nal */.  u8 jour
3fb0: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
3fc0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3fd0: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
3fe0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
3ff0: 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   u8 changeCountD
4000: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  one;         /* 
4010: 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d  Set after increm
4020: 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  enting the chang
4030: 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  e-counter */.  u
4040: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
4050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4060: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
4070: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
4080: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
4090: 38 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20  8 doNotSpill;   
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
40b0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
40c0: 61 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65  ache when non-ze
40d0: 72 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74  ro */.  u8 doNot
40e0: 53 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20  SyncSpill;      
40f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f      /* Do not do
4100: 20 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65   a spill that re
4110: 71 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63  quires jrnl sync
4120: 20 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
4130: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
4140: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
4150: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
4160: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
4170: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
4180: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
4190: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
41a0: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
41b0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
41c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
41d0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
41e0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
41f0: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
4210: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
4220: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
4230: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
4240: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
4250: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4260: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4270: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
4280: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42a0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
42b0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
42c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
42f0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
4300: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
4310: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
4320: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4330: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4340: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4350: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4360: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
4370: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4380: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
4390: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
43a0: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
43b0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
43c0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
43d0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
43e0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
43f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
4400: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4410: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
4420: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4430: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
4440: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4450: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
4460: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
4470: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
4480: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
4490: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
44a0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
44b0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
44c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
44d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
44f0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
4500: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
4510: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
4520: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
4530: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
4540: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
4550: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4560: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
4570: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
4580: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
4590: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
45a0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
45c0: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
45d0: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
45e0: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
45f0: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4610: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4620: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
4630: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
4640: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
4650: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
4660: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
4670: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ile changes */. 
4680: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46a0: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
46b0: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
46c0: 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  ack */..  u16 nE
46d0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
46e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
46f0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4700: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4710: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
4720: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
4730: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4740: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
4750: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
4760: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
4770: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
4780: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
4790: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
47a0: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
47b0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
47c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
47d0: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
47e0: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
47f0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4800: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4810: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
4820: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4830: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4850: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
4860: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
4870: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4890: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
48a0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
48b0: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
48c0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
48d0: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
48e0: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
48f0: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
4900: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
4910: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
4920: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
4930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4940: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4950: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4960: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
4970: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
4980: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
4990: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
49a0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
49b0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
49c0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
49d0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
49e0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
49f0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4a00: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4a10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4a20: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
4a30: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
4a40: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
4a50: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
4a60: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
4a70: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
4a80: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
4a90: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
4aa0: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
4ab0: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
4ac0: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
4ad0: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
4ae0: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
4af0: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
4b00: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
4b10: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
4b20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4b30: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
4b40: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
4b50: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4b60: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4b70: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4b80: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4b90: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4ba0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
4bb0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
4bc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
4bd0: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
4be0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
4bf0: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
4c00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4c10: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
4c20: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
4c30: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4c40: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
4c50: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
4c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
4c70: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
4c80: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
4c90: 64 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69  de=wal" */.#endi
4ca0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
4cb0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
4cc0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
4cd0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
4ce0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
4cf0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
4d00: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
4d10: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
4d20: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
4d30: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
4d40: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
4d50: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
4d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4d80: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
4d90: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4da0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4db0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
4dc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4dd0: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
4de0: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
4df0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
4e00: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
4e10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4e20: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
4e30: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4e40: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4e50: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
4e60: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4e70: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
4e80: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
4e90: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
4ea0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
4eb0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
4ec0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
4ed0: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
4ee0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
4ef0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
4f00: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
4f10: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
4f20: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
4f30: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
4f40: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
4f50: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
4f60: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
4f70: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
4f80: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
4f90: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
4fa0: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
4fb0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
4fc0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
4fd0: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
4fe0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
4ff0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
5000: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
5010: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
5020: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
5030: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
5040: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
5050: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
5060: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
5070: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
5080: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
5090: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
50a0: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
50b0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
50c0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
50d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
50e0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
50f0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
5100: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
5110: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
5120: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
5130: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
5140: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
5150: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
5160: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
5170: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
5180: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
5190: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
51a0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
51b0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
51c0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
51d0: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
51e0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
51f0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
5200: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
5210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
5220: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
5230: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
5240: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
5250: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
5260: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
5270: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
5280: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
5290: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
52a0: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
52b0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
52c0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
52d0: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
52e0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
52f0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
5300: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
5310: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
5320: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
5330: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
5340: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
5350: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
5360: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
5370: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
5380: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
5390: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
53a0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
53b0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
53c0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
53d0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
53e0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
53f0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
5400: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
5410: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
5420: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5430: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
5440: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
5450: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
5460: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
5470: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
5480: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
5490: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
54a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
54b0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
54c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
54d0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
54e0: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
54f0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
5500: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
5510: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
5520: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
5530: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
5540: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
5550: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
5560: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
5570: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
5580: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
5590: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
55a0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
55b0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
55c0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
55d0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
55e0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
55f0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
5600: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
5610: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
5620: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
5630: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
5640: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
5650: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
5660: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
5670: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
5680: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
5690: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
56a0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
56b0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
56c0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
56d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
56e0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
56f0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
5700: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
5710: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
5720: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65  47483647..#ifnde
5730: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
5740: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
5750: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
5760: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
5770: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
5780: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
5790: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
57a0: 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65  ger){..  /* A te
57b0: 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79  mp-file is alway
57c0: 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  s in PAGER_EXCLU
57d0: 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59  SIVE or PAGER_SY
57e0: 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  NCED state. */. 
57f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
5800: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
5810: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
5820: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
5830: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  ;..  /* The chan
5840: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
5850: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66   is always set f
5860: 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f  or temp-files */
5870: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5880: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
5890: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
58a0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
58b0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
58c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
58d0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
58e0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
58f0: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
5900: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
5910: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
5920: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
5930: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
5940: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
5950: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
5960: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
5970: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
5980: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
5990: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
59a0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
59b0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
59c0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
59d0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
59e0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
59f0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
5a00: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
5a10: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
5a20: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
5a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
5a40: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
5a50: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
5a60: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
5a70: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
5a80: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
5a90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
5aa0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
5ab0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
5ac0: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
5ad0: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
5ae0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
5af0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
5b00: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
5b10: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
5b20: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
5b30: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
5b40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
5b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5b60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5b70: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
5b80: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
5b90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5ba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5bb0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
5bc0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
5bd0: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
5be0: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
5bf0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
5c00: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
5c10: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5c20: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
5c30: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5c40: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
5c50: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
5c60: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
5c70: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
5c80: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
5c90: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
5ca0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
5cb0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
5cc0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
5cd0: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
5ce0: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
5cf0: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
5d00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5d10: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
5d20: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
5d30: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
5d40: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
5d50: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
5d60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5d70: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
5d80: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
5d90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5da0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
5db0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
5dc0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
5dd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5de0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
5df0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
5e00: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
5e10: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
5e20: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
5e30: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
5e40: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
5e50: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
5e60: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
5e70: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
5e80: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5e90: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
5ea0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
5eb0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
5ec0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
5ed0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5ee0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
5ef0: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
5f00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5f10: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5f20: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
5f30: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
5f40: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
5f50: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
5f60: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
5f70: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
5f80: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
5f90: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
5fa0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
5fb0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
5fc0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
5fd0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
5fe0: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
5ff0: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
6000: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
6010: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
6020: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
6030: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
6040: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
6050: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
6060: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
6070: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
6080: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
6090: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
60a0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
60b0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
60c0: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  ods)../*.** If f
60d0: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
60e0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
60f0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
6100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
6110: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
6120: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
6130: 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70  ck){.  if( !isOp
6140: 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72  en(pFd) ){.    r
6150: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6160: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
6170: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
6180: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
6190: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
61a0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
61b0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
61c0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
61d0: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
61e0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
61f0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
6200: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
6210: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
6220: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
6230: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
6240: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6250: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
6260: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
6270: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
6280: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
6290: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
62a0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
62b0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
62c0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
62d0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
62e0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
62f0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
6300: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6310: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
6320: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
6330: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
6340: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
6350: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
6360: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
6370: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
6380: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
6390: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
63a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
63b0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
63c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
63d0: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
63e0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
63f0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
6400: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
6410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
6420: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
6430: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
6440: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
6450: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
6460: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
6470: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
6480: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
6490: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
64a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
64b0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
64c0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
64d0: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
6500: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
6510: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
6520: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
6530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
6540: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
6550: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
6580: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
6590: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
65a0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
65b0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
65c0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
65d0: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
65e0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
65f0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
6600: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
6610: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
6620: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
6630: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
6640: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
6650: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
6660: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
6670: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
6680: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
6690: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
66a0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
66b0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
66c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
66d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
66e0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
66f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
6700: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
6710: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
6720: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
6730: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
6740: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
6750: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
6760: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
6770: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
6780: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
6790: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
67a0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
67b0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
67c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
67d0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
67e0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
67f0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
6800: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
6810: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
6820: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
6830: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
6840: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
6850: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
6860: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
6870: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
6880: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
6890: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
68a0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
68b0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
68c0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
68d0: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
68e0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
68f0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
6900: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
6910: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
6920: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
6930: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
6940: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
6950: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6960: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
6970: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
6980: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
6990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
69a0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
69b0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
69c0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
69d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
69e0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
69f0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
6a00: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
6a10: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
6a20: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
6a30: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
6a40: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
6a50: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
6a60: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
6a70: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
6a80: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6a90: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
6aa0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
6ab0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
6ac0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6ad0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
6ae0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
6af0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
6b00: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
6b10: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
6b20: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
6b30: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
6b40: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
6b50: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
6b60: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
6b70: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
6b80: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
6b90: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
6ba0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6bb0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
6bc0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
6bd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
6be0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
6bf0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
6c00: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
6c10: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
6c20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6c30: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
6c40: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6c50: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
6c60: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
6c70: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
6c80: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
6c90: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
6ca0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
6cb0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
6cc0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6cd0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
6ce0: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
6cf0: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
6d00: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
6d10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6d20: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
6d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
6d40: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
6d50: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
6d60: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
6d70: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
6d80: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
6d90: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
6da0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
6db0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
6dc0: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
6dd0: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
6de0: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
6df0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6e00: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
6e10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
6e20: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
6e30: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
6e40: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
6e50: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
6e60: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
6e70: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
6e80: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
6e90: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
6ea0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
6eb0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
6ec0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
6ed0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ee0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6ef0: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
6f00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
6f10: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
6f20: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
6f30: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
6f40: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
6f50: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
6f60: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
6f70: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
6f80: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
6f90: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
6fa0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
6fb0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
6fc0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
6fd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6fe0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6ff0: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
7000: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
7010: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
7020: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
7030: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7040: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
7050: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
7060: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
7070: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
7080: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7090: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
70a0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
70b0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
70c0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
70d0: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
70e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
70f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7100: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
7110: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
7120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
7130: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
7140: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7150: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
7180: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
7190: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
71a0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
71d0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
71e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
71f0: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
7200: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
7210: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
7220: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
7230: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
7240: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7250: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7260: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
7270: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
7280: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
7290: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
72a0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
72b0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
72c0: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
72d0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
72e0: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
72f0: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
7300: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
7310: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7320: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7330: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
7340: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
7350: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
7360: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
7370: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
7380: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
7390: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
73a0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
73b0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
73c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
73d0: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
73e0: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
73f0: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
7400: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7410: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
7420: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
7430: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7440: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
7450: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
7460: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
7470: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
7480: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
7490: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
74a0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
74b0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
74c0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
74d0: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
74e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
74f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7500: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
7510: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
7520: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
7530: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
7540: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
7550: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
7560: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
7570: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
7580: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
7590: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
75a0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
75b0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
75c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
75d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
75e0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
75f0: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
7600: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
7610: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
7620: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
7630: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7640: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
7650: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
7660: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
7670: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
7680: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
7690: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
76a0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
76b0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
76c0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
76d0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
7700: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
7710: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
7720: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
7730: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
7740: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
7760: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
7790: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
77a0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
77b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
77c0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
77d0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
77e0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
77f0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
7800: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
7810: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7820: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
7830: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7840: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7850: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
7860: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
7870: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7880: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
7890: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
78a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
78b0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
78c0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
78d0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
78e0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
78f0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
7900: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
7910: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7920: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
7930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7940: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
7950: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
7960: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
7970: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
7980: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
7990: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
79a0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
79b0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
79c0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
79d0: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
79e0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
79f0: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
7a00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
7a10: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
7a20: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
7a30: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
7a40: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
7a50: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
7a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
7a70: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
7a80: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
7a90: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
7aa0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
7ab0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
7ac0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
7ad0: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
7ae0: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
7af0: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
7b00: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
7b10: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
7b20: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
7b30: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
7b40: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
7b50: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
7b60: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
7b70: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
7b80: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
7b90: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
7ba0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
7bb0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
7bc0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
7bd0: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
7be0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
7bf0: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
7c00: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
7c10: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
7c20: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
7c30: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
7c40: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
7c50: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
7c60: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
7c70: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
7c80: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
7c90: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
7ca0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
7cb0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
7cc0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
7cd0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
7ce0: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
7cf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7d30: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
7d40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
7d50: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7d60: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
7d70: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
7d80: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
7d90: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7da0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
7db0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
7dc0: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
7dd0: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
7de0: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
7df0: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
7e00: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
7e10: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
7e20: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
7e30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7e40: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7e50: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
7e60: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
7e70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
7e80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7e90: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
7ea0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
7eb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
7ec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
7ed0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
7ee0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7ef0: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
7f00: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
7f10: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
7f20: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
7f30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
7f40: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
7f50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
7f60: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
7f70: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
7f80: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
7f90: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
7fa0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
7fb0: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
7fc0: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
7fd0: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
7fe0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
7ff0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
8000: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
8010: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
8020: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
8030: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
8040: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
8050: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
8060: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
8070: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
8080: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
8090: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
80a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
80b0: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
80c0: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
80d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
80e0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
80f0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
8100: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8110: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
8120: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8130: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8140: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
8150: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
8160: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8170: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8180: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8190: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
81a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
81b0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
81c0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
81d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
81e0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
81f0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8200: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
8210: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8220: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
8230: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
8240: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
8250: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
8260: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
8270: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
8280: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
8290: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
82a0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
82b0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
82c0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
82d0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
82e0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
82f0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
8300: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
8310: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
8320: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
8330: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
8340: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
8350: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
8360: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
8370: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
8380: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
8390: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
83a0: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
83b0: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
83c0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
83d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
83e0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
83f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8400: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8410: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
8420: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
8430: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
8440: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
8450: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
8460: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
8470: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
8480: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
8490: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
84a0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  ->pageSize;     
84b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
84c0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
84d0: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
84e0: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
8510: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
8520: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8550: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8560: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
8570: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
8580: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
8590: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
85a0: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
85b0: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
85c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
85d0: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
85e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
85f0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
8600: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
8610: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
8620: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
8630: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
8640: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
8650: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
8660: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
8670: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
8680: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
8690: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
86a0: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
86b0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
86c0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
86d0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
86e0: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
86f0: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
8700: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
8710: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
8720: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
8730: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
8740: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
8750: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
8760: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
8770: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8780: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8790: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a  pPager);..  /* .
87a0: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
87b0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
87c0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
87d0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
87e0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
87f0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
8800: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
8810: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
8820: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
8830: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
8840: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
8850: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
8860: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
8870: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
8880: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
8890: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
88a0: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
88b0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
88c0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
88d0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
88e0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
88f0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
8900: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
8910: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
8920: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
8930: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
8940: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
8950: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
8960: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
8970: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
8980: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
8990: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
89a0: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
89b0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
89c0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
89d0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
89e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
89f0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
8a00: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
8a10: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
8a20: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
8a30: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
8a40: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
8a50: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
8a60: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
8a70: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
8a80: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
8a90: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
8aa0: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
8ab0: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
8ac0: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
8ad0: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
8ae0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
8af0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
8b00: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
8b10: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
8b20: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
8b30: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
8b40: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
8b50: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
8b60: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
8b70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
8b80: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
8b90: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
8ba0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
8bb0: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
8bc0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
8bd0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
8be0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8bf0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
8c00: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
8c10: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
8c20: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
8c30: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
8c40: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
8c50: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
8c60: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
8c80: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
8c90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8ca0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8cb0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
8cc0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
8cd0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
8ce0: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
8cf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
8d00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
8d10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
8d20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
8d30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
8d40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
8d50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8d60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
8d70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
8d80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8d90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8da0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
8db0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
8dc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
8dd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
8de0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8df0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8e00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
8e10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
8e20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
8e30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
8e40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
8e50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8e60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8e70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
8e80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
8e90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
8ea0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
8eb0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8ec0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8ed0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
8ee0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8ef0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
8f00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
8f10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
8f20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
8f30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
8f40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
8f50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
8f60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
8f70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
8f80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
8f90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
8fa0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
8fb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
8fc0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
8fd0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
8fe0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
8ff0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
9000: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9010: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
9020: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
9030: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
9040: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
9050: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
9060: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
9070: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
9080: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
9090: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
90a0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
90b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
90c0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
90d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
90e0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
90f0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
9100: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
9110: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
9120: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
9130: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
9140: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
9150: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
9160: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
9170: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
9180: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
9190: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
91a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
91b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
91c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
91d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
91e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
91f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
9200: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
9210: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
9220: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
9230: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
9240: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
9250: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
9260: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
9270: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
9280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
9290: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
92a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
92b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
92c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
92d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
92e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
92f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
9300: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
9310: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
9320: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
9330: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
9340: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
9350: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
9360: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
9370: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
9380: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
9390: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
93a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
93b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
93c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
93d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
93e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
93f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
9400: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
9410: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9420: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
9430: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
9440: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
9450: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
9460: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
9470: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
9480: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
9490: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
94a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
94b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
94c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
94d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
94e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
94f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9500: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
9510: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9520: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
9530: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9540: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9550: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9560: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
9570: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
9580: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
9590: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
95a0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
95b0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
95c0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
95d0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
95e0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
95f0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
9600: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
9610: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
9620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
9630: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
9640: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9650: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
9660: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
9670: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9680: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
9690: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
96a0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
96b0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
96c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
96d0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
96e0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
96f0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
9700: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
9710: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
9720: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
9730: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
9740: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
9750: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
9760: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9770: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
9780: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9790: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
97a0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
97b0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
97c0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
97d0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
97e0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
97f0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
9800: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
9810: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
9820: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
9830: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
9840: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
9850: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
9860: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
9870: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
9880: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
9890: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
98a0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
98b0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
98c0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
98d0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
98e0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
98f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
9900: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
9910: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
9920: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
9930: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
9940: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
9950: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9970: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
9980: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
9990: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
99a0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
99b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
99c0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
99d0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
99e0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
99f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9a10: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
9a20: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
9a30: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
9a40: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
9a50: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
9a60: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
9a90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
9aa0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
9ab0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9ac0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
9ad0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
9ae0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
9af0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
9b00: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9b10: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
9b20: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
9b30: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
9b40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
9b50: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
9b60: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
9b70: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
9b80: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
9b90: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
9ba0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
9bb0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
9bc0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
9bd0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
9be0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
9bf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9c00: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
9c10: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
9c20: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9c30: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9c40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c50: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
9c60: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
9c70: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
9c80: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
9c90: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
9ca0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
9cb0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
9cc0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
9cd0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
9ce0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
9cf0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
9d00: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
9d10: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
9d20: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
9d30: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
9d50: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
9d60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9d70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9d80: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
9d90: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
9da0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
9db0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
9dc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
9dd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9de0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
9df0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
9e00: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
9e10: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
9e20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9e30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
9e40: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
9e50: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
9e60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
9e70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
9e80: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
9e90: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
9ea0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
9eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
9ec0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
9ed0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
9ee0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
9ef0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
9f00: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
9f10: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
9f20: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
9f30: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
9f40: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9f50: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
9f60: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9f70: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9f80: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9f90: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
9fa0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
9fb0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9fc0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9fd0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9fe0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
9ff0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a000: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
a010: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a020: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
a030: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
a040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
a050: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
a060: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a070: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
a080: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
a090: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
a0a0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
a0b0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
a0c0: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
a0d0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
a0e0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
a0f0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
a100: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
a110: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
a120: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
a130: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
a140: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
a150: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a160: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
a170: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a180: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
a190: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
a1a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
a1b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a1c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
a1d0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
a1e0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
a1f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a200: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
a210: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
a220: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
a230: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
a240: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
a250: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
a260: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
a270: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
a280: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
a290: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
a2a0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
a2b0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a2c0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
a2d0: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
a2e0: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
a2f0: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
a300: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
a310: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
a320: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
a330: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
a340: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
a350: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
a360: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
a370: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
a380: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
a390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
a3a0: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
a3b0: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
a3c0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
a3d0: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
a3e0: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
a3f0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a400: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
a410: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
a420: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
a430: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
a440: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
a450: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
a460: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
a470: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
a480: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
a490: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
a4a0: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
a4b0: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
a4c0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
a4d0: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
a4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
a4f0: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
a500: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a510: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
a520: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a530: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
a540: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
a550: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a560: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
a570: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
a580: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
a590: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
a5a0: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
a5b0: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
a5c0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
a5d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
a5e0: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
a5f0: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
a600: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
a610: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
a620: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
a630: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
a640: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
a650: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
a660: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a670: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
a680: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
a690: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
a6a0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
a6b0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
a6c0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
a6d0: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
a6e0: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a6f0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a700: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a710: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
a720: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
a730: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
a740: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
a750: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
a760: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
a770: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
a780: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
a790: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
a7a0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a7b0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a7c0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a7d0: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a7e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
a7f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
a800: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
a810: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
a820: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
a830: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a840: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a850: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a860: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a880: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a890: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a8a0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a8b0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a8c0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a8d0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a8e0: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a8f0: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a900: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a910: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a920: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a930: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a940: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a950: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a960: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a970: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a980: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a990: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a9a0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
a9b0: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
a9c0: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
a9d0: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
a9e0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
a9f0: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
aa00: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
aa10: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
aa20: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
aa30: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
aa40: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
aa50: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
aa60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
aa70: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
aa80: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
aa90: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
aaa0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
aab0: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
aac0: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
aad0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
aae0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
aaf0: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
ab00: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
ab10: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
ab20: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
ab30: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
ab40: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
ab50: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
ab60: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
ab70: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
ab80: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
ab90: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
aba0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
abb0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
abc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
abd0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
abe0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ac10: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
ac20: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
ac30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
ac40: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
ac50: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
ac60: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ac80: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
ac90: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
aca0: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
acb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
acc0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
acd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
ace0: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
acf0: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
ad10: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
ad20: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
ad30: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
ad40: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
ad50: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
ad60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
ad70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
ad80: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
ad90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ada0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
adb0: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
adc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
add0: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
ade0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
adf0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
ae00: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
ae10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ae20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
ae30: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ae40: 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
ae50: 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
ae60: 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
ae70: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
ae80: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
ae90: 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
aea0: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
aeb0: 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
aec0: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
aed0: 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
aee0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
aef0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
af00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
af10: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
af20: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
af30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
af40: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
af50: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
af60: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
af70: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
af80: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
af90: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
afa0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
afb0: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
afc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
afd0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
afe0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
aff0: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
b000: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
b010: 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
b020: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b030: 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
b040: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
b050: 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
b060: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
b070: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
b080: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
b090: 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
b0a0: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
b0b0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
b0c0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
b0d0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
b0e0: 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
b0f0: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
b100: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b110: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
b120: 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
b130: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
b140: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
b150: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
b160: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
b170: 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
b180: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
b190: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
b1a0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
b1b0: 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
b1c0: 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
b1d0: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b1e0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b1f0: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
b200: 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
b210: 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
b220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
b230: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
b240: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
b250: 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61  aster+20);.  pPa
b260: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
b270: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
b280: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
b290: 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
b2a0: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
b2b0: 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
b2c0: 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
b2d0: 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
b2e0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
b2f0: 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
b300: 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
b310: 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
b320: 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
b330: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
b340: 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
b350: 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
b360: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
b370: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
b380: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b390: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
b3a0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
b3b0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
b3c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
b3d0: 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
b3e0: 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
b3f0: 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
b400: 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
b410: 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
b420: 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
b430: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
b440: 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
b450: 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
b460: 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
b470: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
b480: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b490: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
b4a0: 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
b4b0: 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
b4c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
b4d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b4e0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b4f0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
b500: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
b510: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b520: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
b530: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
b540: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
b550: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65   page number. Re
b560: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
b570: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
b580: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71   NULL if the req
b590: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
b5a0: 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  ot .** already i
b5b0: 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  n memory..*/.sta
b5c0: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
b5d0: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
b5e0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
b5f0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
b620: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20   value */..  /* 
b630: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
b640: 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f  le for a call to
b650: 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77   PcacheFetch() w
b660: 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
b670: 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20  0 to.  ** fail, 
b680: 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74  since no attempt
b690: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e   to allocate dyn
b6a0: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  amic memory will
b6b0: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
b6c0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63   (void)sqlite3Pc
b6d0: 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
b6e0: 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
b6f0: 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72   0, &p);.  retur
b700: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
b710: 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
b720: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b730: 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  , discard all in
b740: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49  -memory pages. I
b750: 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69  f.** the pager i
b760: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b770: 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
b780: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
b790: 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e  ** TODO: Why can
b7a0: 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68   we not reset th
b7b0: 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e  e pager while in
b7c0: 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f   error state?.*/
b7d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b7e0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b7f0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53  pPager){.  if( S
b800: 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72  QLITE_OK==pPager
b810: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b820: 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
b830: 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
b840: 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69  ackup);.    sqli
b850: 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
b860: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
b870: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
b880: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
b890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
b8a0: 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
b8b0: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
b8c0: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
b8d0: 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
b8e0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b8f0: 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
b900: 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
b910: 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
b920: 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
b930: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
b940: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
b950: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
b960: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b970: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
b980: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b990: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
b9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
b9b0: 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
b9c0: 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
b9d0: 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
b9e0: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
b9f0: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
ba00: 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
ba10: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
ba20: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
ba30: 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
ba40: 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
ba50: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ba60: 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
ba70: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
ba80: 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
ba90: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
baa0: 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
bab0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
bac0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
bad0: 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
bae0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
baf0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
bb00: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
bb10: 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
bb20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
bb30: 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
bb40: 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
bb50: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
bb60: 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
bb70: 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
bb80: 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
bb90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
bba0: 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
bbb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
bbc0: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
bbd0: 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
bbe0: 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
bbf0: 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
bc00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
bc10: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
bc20: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bc30: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bc40: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
bc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bc60: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bc70: 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
bc80: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
bc90: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
bca0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
bcb0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
bcc0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
bcd0: 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
bce0: 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
bcf0: 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
bd00: 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
bd10: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
bd40: 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
bd50: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
bd60: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
bd70: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
bd80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bd90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bda0: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
bdb0: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
bdc0: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
bdd0: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
bde0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
bdf0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
be00: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
be10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
be20: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
be30: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
be40: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
be50: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
be60: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
be70: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
be80: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
be90: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
bea0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
beb0: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
bec0: 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65  ,y,z) 0.# define
bed0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
bee0: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
bef0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
bf00: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
bf10: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
bf20: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
bf30: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
bf40: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
bf50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
bf60: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
bf70: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
bf80: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
bf90: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
bfa0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
bfb0: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
bfc0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
bfd0: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
bfe0: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
bff0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
c000: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
c010: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
c020: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
c030: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
c040: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
c050: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
c060: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
c070: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
c080: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
c090: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
c0a0: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
c0b0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
c0c0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
c0d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c0e0: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
c0f0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
c100: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c110: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
c120: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c130: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
c140: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20  turn code */.   
c150: 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65   int iDc = isOpe
c160: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71  n(pPager->fd)?sq
c170: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
c180: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
c190: 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20  ger->fd):0;..   
c1a0: 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61   /* If the opera
c1b0: 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
c1c0: 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  ort deletion of 
c1d0: 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e  open files, then
c1e0: 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68  .    ** close th
c1f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c200: 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
c210: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20   database lock. 
c220: 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
c230: 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  * another connec
c240: 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
c250: 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
c260: 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66  ght delete the f
c270: 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66  ile.    ** out f
c280: 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
c290: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
c2a0: 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
c2b0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35  ODE_MEMORY   & 5
c2c0: 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
c2d0: 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
c2e0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
c2f0: 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
c300: 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
c310: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
c320: 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
c330: 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
c340: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
c350: 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ETE   & 5)!=1 );
c360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
c370: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c380: 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
c390: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c3a0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c3b0: 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29  DE_PERSIST  & 5)
c3c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==1 );.    if( 0
c3d0: 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ==(iDc & SQLITE_
c3e0: 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
c3f0: 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20  E_WHEN_OPEN).   
c400: 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d    || 1!=(pPager-
c410: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35  >journalMode & 5
c420: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
c430: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c440: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c450: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  }..    sqlite3Bi
c460: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
c470: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
c480: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
c490: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c4a0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
c4b0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
c4c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
c4d0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
c4e0: 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69  somebody else mi
c4f0: 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54  ght change it. T
c500: 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
c510: 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
c520: 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67  .dbSize etc. mig
c530: 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  ht become invali
c540: 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  d if.    ** this
c550: 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63   happens.  One c
c560: 61 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68  an argue that th
c570: 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  is doesn't need 
c580: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20  to be cleared.  
c590: 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63    ** until the c
c5a0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68  hange-counter ch
c5b0: 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67  eck fails in Pag
c5c0: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a  erSharedLock()..
c5d0: 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20      ** Clearing 
c5e0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61  the page size ca
c5f0: 63 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e  che here is bein
c600: 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a  g conservative..
c610: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
c620: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
c630: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   0;..    if( pag
c640: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c650: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c660: 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
c670: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
c680: 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
c690: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  .      rc = osUn
c6a0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c6b0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d   NO_LOCK);.    }
c6c0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c6d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c6e0: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
c6f0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
c700: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
c710: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
c720: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
c730: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
c740: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
c750: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
c760: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
c770: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
c780: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
c790: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
c7a0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
c7b0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
c7c0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
c7d0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
c7e0: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
c7f0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c800: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
c810: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c820: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c830: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c840: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c850: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
c860: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
c870: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
c880: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c890: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
c8a0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
c8b0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  R_UNLOCK;.    pP
c8c0: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
c8d0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
c8e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c8f0: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
c900: 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c  d when an IOERR,
c910: 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c   CORRUPT or FULL
c920: 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61   error.** may ha
c930: 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65  ve occurred. The
c940: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
c950: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c960: 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74  the pager .** st
c970: 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
c980: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
c990: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
c9a0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
c9b0: 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74  er .** API funct
c9c0: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
c9d0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
c9e0: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
c9f0: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
ca00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
ca10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
ca20: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
ca30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
ca40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
ca50: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
ca60: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
ca70: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
ca80: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
ca90: 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  nt error is clea
caa0: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
cab0: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
cac0: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
cad0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
cae0: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
caf0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
cb00: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
cb10: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
cb20: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
cb30: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
cb40: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
cb50: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
cb60: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
cb70: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
cb80: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
cb90: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
cba0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
cbb0: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
cbc0: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
cbd0: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
cbe0: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
cbf0: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
cc00: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
cc10: 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
cc20: 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
cc30: 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
cc40: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
cc50: 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
cc60: 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
cc70: 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
cc80: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
cc90: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
cca0: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
ccb0: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
ccc0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
ccd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
cce0: 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
ccf0: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
cd00: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
cd10: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
cd20: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cd30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
cd40: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
cd50: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
cd60: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
cd70: 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
cd80: 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
cd90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
cda0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
cdb0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
cdc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cdd0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
cde0: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
cdf0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
ce00: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
ce10: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
ce20: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
ce30: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
ce40: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
ce50: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
ce60: 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
ce70: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
ce80: 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
ce90: 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
cea0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
ceb0: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
cec0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
ced0: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
cee0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
cef0: 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
cf00: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c  base file and cl
cf10: 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
cf20: 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ate. If this mea
cf30: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  ns that.** there
cf40: 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
cf50: 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
cf60: 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
cf70: 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ext connection.*
cf80: 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  * to obtain a sh
cf90: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
cfa0: 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
cfb0: 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77  y be this one) w
cfc0: 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62  ill.** roll it b
cfd0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
cfe0: 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
cff0: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
d000: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
d010: 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
d020: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
d030: 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
d040: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
d050: 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
d060: 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
d070: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
d080: 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63  rror state. Whic
d090: 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
d0a0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
d0b0: 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
d0c0: 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
d0d0: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
d0e0: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
d0f0: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
d100: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d110: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
d120: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  ode==SQLITE_OK &
d130: 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
d140: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
d150: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
d160: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
d170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d180: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
d190: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
d1a0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
d1b0: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
d1c0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
d1d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d1e0: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
d1f0: 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
d200: 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
d210: 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
d220: 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
d230: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
d240: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
d250: 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
d260: 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
d270: 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
d280: 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
d290: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
d2a0: 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
d2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d2c0: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
d2d0: 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
d2e0: 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
d2f0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
d300: 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  ction..** .** If
d310: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
d320: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72   PAGER_SHARED or
d330: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
d340: 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
d350: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d360: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d370: 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54  p (returns SQLIT
d380: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  E_OK)..**.** Oth
d390: 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
d3a0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
d3b0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
d3c0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
d3d0: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
d3e0: 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
d3f0: 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
d400: 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
d410: 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
d420: 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
d430: 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
d440: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
d450: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
d460: 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
d470: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
d480: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
d490: 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
d4a0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
d4b0: 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
d4c0: 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
d4d0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
d4e0: 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
d4f0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
d500: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
d510: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
d520: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
d530: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
d540: 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
d550: 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
d560: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
d570: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
d580: 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
d590: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
d5a0: 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
d5b0: 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
d5c0: 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
d5d0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
d5e0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d5f0: 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
d600: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
d610: 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
d620: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
d630: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
d640: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
d650: 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
d660: 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
d670: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d680: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
d690: 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
d6a0: 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
d6b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
d6c0: 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
d6d0: 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
d6e0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
d6f0: 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
d700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
d710: 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
d720: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
d730: 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
d740: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
d750: 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
d760: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
d770: 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
d780: 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
d790: 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
d7a0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d7b0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
d7c0: 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
d7d0: 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
d7e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d7f0: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
d800: 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
d810: 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
d820: 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
d830: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
d840: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d850: 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
d860: 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
d870: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
d880: 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
d890: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
d8a0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
d8b0: 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20  s finalized, if 
d8c0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
d8d0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d8e0: 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65  he.** pager move
d8f0: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
d900: 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77  D state (and dow
d910: 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b  ngrades the lock
d920: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
d930: 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69  ase file accordi
d940: 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ngly)..**.** If 
d950: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
d960: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
d970: 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e  e mode and is in
d980: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74   PAGER_SYNCED st
d990: 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73  ate,.** it moves
d9a0: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
d9b0: 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72  IVE. No locks ar
d9c0: 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65  e downgraded whe
d9d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20  n running in.** 
d9e0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
d9f0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
da00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
da10: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
da20: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
da30: 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
da40: 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
da50: 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
da60: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
da70: 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
da80: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
da90: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
daa0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
dab0: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
dac0: 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
dad0: 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
dae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
daf0: 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
db00: 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
db10: 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
db20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
db30: 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
db40: 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
db50: 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
db60: 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
db70: 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
db80: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
db90: 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
dba0: 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
dbb0: 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
dbc0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
dbd0: 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
dbe0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
dbf0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
dc00: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
dc10: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
dc20: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
dc30: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dc40: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
dc50: 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
dc60: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
dc70: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
dc80: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
dc90: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
dca0: 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
dcb0: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
dcc0: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
dcd0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
dce0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
dcf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dd00: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c    }.  releaseAll
dd10: 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
dd20: 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  r);..  assert( i
dd30: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
dd40: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
dd50: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
dd60: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
dd70: 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
dd80: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
dd90: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
dda0: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ddb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ddc0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
ddd0: 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
dde0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
ddf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
de00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
de10: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
de20: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
de30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
de40: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
de50: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
de60: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
de70: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
de80: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
de90: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
dea0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
deb0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
dec0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ded0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dee0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
def0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
df00: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
df10: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
df20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
df30: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
df40: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
df50: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
df60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
df70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
df80: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
df90: 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
dfa0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
dfb0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
dfc0: 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
dfd0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
dfe0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
dff0: 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
e000: 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
e010: 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ter);.      page
e020: 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
e030: 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rc);.      pPage
e040: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
e050: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
e060: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
e070: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
e080: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
e090: 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
e0a0: 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
e0b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
e0c0: 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
e0d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
e0e0: 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
e0f0: 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
e100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e110: 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
e120: 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
e130: 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
e140: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
e150: 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
e160: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e170: 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
e180: 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
e190: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  ry journal. .   
e1a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e1b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
e1c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
e1d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
e1e0: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
e1f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e200: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e210: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
e220: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
e230: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e240: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e250: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
e260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e270: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
e280: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
e290: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
e2a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
e2b0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
e2c0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
e2d0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e2e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e2f0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
e300: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
e310: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
e320: 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
e330: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
e340: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
e350: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e360: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
e370: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
e380: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
e390: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
e3a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
e3b0: 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
e3c0: 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
e3d0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
e3e0: 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
e3f0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
e400: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
e410: 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
e420: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
e430: 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
e440: 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
e450: 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  K );.    pPager-
e460: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
e470: 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49  HARED;..    /* I
e480: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
e490: 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   was in locking_
e4a0: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
e4b0: 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f  ode but is no lo
e4c0: 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f  nger,.    ** dro
e4d0: 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
e4e0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
e4f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e500: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
e510: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
e520: 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
e530: 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
e540: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
e550: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d  ) ){.      rc2 =
e560: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
e570: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
e580: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  K);.    }.  }els
e590: 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
e5a0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
e5b0: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
e5c0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
e5d0: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
e5e0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e5f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
e600: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
e610: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
e620: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
e630: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e640: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
e650: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
e660: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
e670: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
e680: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
e690: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e6a0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
e6b0: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
e6c0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68    /* TODO: Is th
e6d0: 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20  is optimal? Why 
e6e0: 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69  is the db size i
e6f0: 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20  nvalidated here 
e700: 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64  .  ** when the d
e710: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
e720: 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f  not unlocked? */
e730: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
e740: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c  gSize = 0;.  sql
e750: 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61  ite3PcacheTrunca
e760: 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  te(pPager->pPCac
e770: 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  he, pPager->dbSi
e780: 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ze);.  if( !MEMD
e790: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
e7a0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
e7b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
e7c0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
e7d0: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
e7e0: 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
e7f0: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
e800: 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
e810: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
e820: 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
e830: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
e840: 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
e850: 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
e860: 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
e870: 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
e880: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
e890: 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
e8a0: 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
e8b0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
e8c0: 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
e8d0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
e8e0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
e8f0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
e900: 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
e910: 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
e920: 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
e930: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
e940: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
e950: 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
e960: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
e970: 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
e980: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
e990: 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
e9a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
e9b0: 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
e9c0: 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
e9d0: 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
e9e0: 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
e9f0: 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
ea00: 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
ea10: 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
ea20: 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
ea30: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
ea40: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
ea50: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
ea60: 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
ea70: 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
ea80: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
ea90: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
eaa0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
eab0: 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
eac0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
ead0: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
eae0: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
eaf0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
eb00: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
eb10: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
eb20: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
eb30: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
eb40: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
eb50: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
eb60: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
eb70: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
eb80: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
eb90: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
eba0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ebb0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
ebc0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
ebd0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ebe0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
ebf0: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
ec00: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
ec10: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
ec20: 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
ec30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ec40: 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
ec50: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
ec60: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
ec70: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
ec80: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
ec90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
eca0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
ecb0: 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
ecc0: 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
ecd0: 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
ece0: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
ecf0: 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
ed00: 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
ed10: 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
ed20: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
ed30: 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
ed40: 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
ed50: 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
ed60: 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
ed70: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
ed80: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
ed90: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
eda0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
edb0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67   isMainJrnl flag
edc0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73   is true if this
edd0: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   is the main rol
ede0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
edf0: 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74  d.** false for t
ee00: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ee10: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20  rnal.  The main 
ee20: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
ee30: 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75   uses.** checksu
ee40: 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
ee50: 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
ee60: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
ee70: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
ee80: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
ee90: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
eea0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
eeb0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
eec0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
eed0: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
eee0: 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
eef0: 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
ef00: 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
ef10: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
ef20: 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
ef30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
ef40: 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
ef50: 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
ef60: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
ef70: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
ef80: 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
ef90: 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
efa0: 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
efb0: 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
efc0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
efd0: 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
efe0: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
eff0: 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
f000: 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
f010: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
f020: 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
f030: 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
f040: 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
f050: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
f060: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
f070: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
f080: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
f090: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
f0a0: 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
f0b0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
f0c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
f0d0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
f0e0: 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
f0f0: 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
f100: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
f110: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
f120: 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
f130: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f140: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
f150: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
f160: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
f170: 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
f180: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
f190: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
f1a0: 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
f1b0: 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
f1c0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
f1d0: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
f1e0: 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
f1f0: 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
f200: 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
f210: 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
f220: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
f230: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
f240: 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
f250: 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
f260: 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
f270: 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
f280: 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
f290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
f2a0: 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
f2b0: 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
f2c0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f2d0: 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
f2e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
f2f0: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
f300: 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
f310: 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
f320: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
f330: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
f340: 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
f350: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
f360: 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
f370: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
f380: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
f390: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
f3a0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
f3b0: 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
f3c0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
f3d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
f3e0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f3f0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
f400: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
f410: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f430: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
f440: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
f450: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
f460: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f470: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f480: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
f490: 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
f4a0: 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
f4b0: 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
f4c0: 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
f4d0: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
f4e0: 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
f4f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f500: 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
f510: 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
f520: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
f530: 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
f540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
f550: 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
f560: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
f570: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
f580: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
f590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f5a0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
f5b0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
f5c0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
f5f0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
f600: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
f610: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
f620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
f630: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
f640: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
f650: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
f660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f670: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
f680: 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
f690: 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
f6a0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
f6b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
f6c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
f6d0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
f6e0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
f6f0: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
f700: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
f710: 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
f720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
f730: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
f740: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
f750: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
f760: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
f770: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
f780: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
f790: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
f7a0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
f7b0: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
f7c0: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
f7d0: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
f7e0: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
f7f0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
f800: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
f810: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
f820: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
f830: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
f840: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
f850: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
f860: 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
f870: 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
f880: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
f890: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
f8a0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
f8b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
f8c0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
f8d0: 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
f8e0: 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
f8f0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ) );..  /* Read 
f900: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
f910: 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
f920: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
f930: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
f940: 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
f950: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
f960: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
f970: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f980: 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
f990: 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
f9a0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
f9b0: 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
f9c0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
f9d0: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
f9e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f9f0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
fa00: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
fa10: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
fa20: 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
fa30: 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
fa40: 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
fa50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
fa60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
fa70: 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
fa80: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
fa90: 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
faa0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
fab0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
fac0: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
fad0: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
fae0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
faf0: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
fb00: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
fb10: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
fb20: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
fb30: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
fb40: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
fb50: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
fb60: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
fb70: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
fb80: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
fb90: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
fba0: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
fbb0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
fbc0: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
fbd0: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
fbe0: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
fbf0: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
fc00: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
fc10: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
fc20: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fc30: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
fc40: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
fc50: 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
fc60: 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
fc70: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
fc80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fc90: 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
fca0: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
fcb0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
fcc0: 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
fcd0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
fce0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
fcf0: 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
fd00: 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
fd10: 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
fd20: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
fd30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fd40: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
fd50: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
fd60: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
fd70: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
fd80: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
fd90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
fda0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
fdb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
fdc0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
fdd0: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
fde0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
fdf0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
fe00: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
fe10: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
fe20: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
fe30: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
fe40: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
fe50: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
fe60: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
fe70: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
fe80: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
fe90: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
fea0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
feb0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
fec0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
fed0: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
fee0: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
fef0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
ff00: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ff10: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
ff20: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
ff30: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
ff40: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
ff50: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
ff60: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
ff70: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
ff80: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
ff90: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
ffa0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
ffb0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
ffc0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
ffd0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
ffe0: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
fff0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
10000 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
10010 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
10020 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
10030 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
10040 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
10050 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
10060 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
10070 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
10080 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
10090 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
100a0 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
100b0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
100c0 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
100d0 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
100e0 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
100f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10100 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
10110 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
10120 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
10130 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
10140 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
10150 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
10170 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
10180 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
10190 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
101a0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
101b0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
101c0 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
101d0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
101e0 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
101f0 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
10200 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
10210 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
10220 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
10230 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
10240 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
10250 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
10260 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
10270 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
10280 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
10290 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
102a0 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
102b0 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
102c0 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
102d0 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
102e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
102f0 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
10300 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
10310 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
10320 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
10330 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
10340 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
10350 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
10360 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
10370 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
10380 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
10390 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
103a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
103b0 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
103c0 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
103d0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
103e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
103f0 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
10400 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
10410 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
10420 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
10430 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
10440 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
10450 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
10460 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
10470 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
10480 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
10490 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
104a0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
104b0 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
104c0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
104d0 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
104e0 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
104f0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
10500 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
10510 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
10520 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
10530 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
10540 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
10550 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
10560 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
10570 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
10580 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
10590 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
105a0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
105b0 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
105c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45  !MEMDB );.  PAGE
105d0 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
105e0 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
105f0 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
10600 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
10610 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
10620 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
10630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10640 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
10650 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
10660 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
10670 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
10680 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
10690 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
106a0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
106b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
106c0 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
106d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
106e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
106f0 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
10700 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
10710 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
10720 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
10730 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
10740 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
10750 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28  E).   && isOpen(
10760 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
10770 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
10780 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
10790 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
107a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
107b0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
107c0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
107d0 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
107e0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
107f0 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
10800 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
10810 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
10820 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10830 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
10840 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
10850 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
10860 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
10870 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
10880 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
10890 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
108a0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
108b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
108c0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
108d0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
108e0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
108f0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
10900 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
10910 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
10920 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
10930 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
10940 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
10950 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
10960 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
10970 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
10980 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
10990 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
109a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
109b0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
109c0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
109d0 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
109e0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
109f0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
10a00 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
10a10 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
10a20 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
10a30 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
10a40 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
10a50 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
10a60 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
10a70 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
10a80 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
10a90 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
10aa0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
10ab0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
10ac0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
10ad0 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
10ae0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
10af0 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
10b00 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
10b10 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
10b20 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
10b30 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
10b40 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
10b50 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
10b60 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
10b70 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
10b80 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
10b90 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
10ba0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
10bb0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
10bc0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
10bd0 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
10be0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
10bf0 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
10c00 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
10c10 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
10c20 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
10c30 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
10c40 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
10c50 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
10c60 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
10c70 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
10c80 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
10c90 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
10ca0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
10cb0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
10cc0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
10cd0 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
10ce0 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
10cf0 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
10d00 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
10d10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
10d20 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
10d30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10d40 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
10d50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
10d60 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
10d70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10d80 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
10d90 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
10da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10db0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
10dc0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
10dd0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
10de0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10df0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10e00 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
10e10 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
10e20 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
10e30 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
10e40 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
10e50 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
10e60 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
10e70 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
10e80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
10e90 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
10ea0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
10eb0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
10ec0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
10ed0 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
10ee0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
10ef0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
10f00 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
10f10 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
10f20 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10f30 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
10f40 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
10f50 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
10f60 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
10f70 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
10f80 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
10f90 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
10fa0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
10fb0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
10fc0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
10fd0 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
10fe0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
10ff0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
11000 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
11010 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
11020 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
11030 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
11040 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
11050 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
11060 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
11070 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
11080 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
11090 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
110a0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
110b0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
110c0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
110d0 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
110e0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
110f0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
11100 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
11110 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
11120 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
11130 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
11140 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
11150 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
11160 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
11170 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
11180 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
11190 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
111a0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
111b0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
111c0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
111d0 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
111e0 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
111f0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
11200 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
11210 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
11220 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
11230 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
11240 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
11250 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
11260 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
11270 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
11280 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
11290 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
112a0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
112b0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
112c0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
112d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
112e0 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
112f0 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
11300 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
11310 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
11320 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
11330 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
11340 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
11350 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
11360 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
11370 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
11380 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
11390 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
113a0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
113b0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
113c0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
113d0 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
113e0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
113f0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
11400 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
11410 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
11420 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
11430 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
11440 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
11450 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
11460 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
11470 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
11480 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
11490 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
114a0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
114b0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
114c0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
114d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
114e0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
114f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
11500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
11510 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
11520 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  g);.    }.#ifdef
11530 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
11540 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
11550 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
11560 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
11570 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
11580 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
11590 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
115a0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
115b0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
115c0 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
115d0 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
115e0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
115f0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
11600 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
11610 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
11620 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
11630 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
11640 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
11650 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
11660 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
11670 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
11680 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
11690 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
116a0 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
116b0 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
116c0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
116d0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
116e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
116f0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
11700 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
11710 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11720 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
11730 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
11740 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
11750 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11760 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
11770 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
11780 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
11790 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
117a0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
117b0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
117c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
117d0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
117e0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
117f0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
11800 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
11810 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
11820 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
11830 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
11840 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
11850 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
11860 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
11870 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11880 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
11890 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
118a0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
118b0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
118c0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
118d0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
118e0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
118f0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
11900 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
11910 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
11920 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
11930 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
11940 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
11950 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
11960 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
11970 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
11980 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
11990 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
119a0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
119b0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
119c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
119d0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
119e0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
119f0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
11a00 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
11a10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
11a20 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
11a30 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
11a40 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
11a50 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
11a60 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
11a70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11a80 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
11a90 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
11aa0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
11ab0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
11ac0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
11ad0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
11ae0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
11af0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
11b00 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
11b10 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
11b20 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
11b30 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
11b40 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
11b50 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
11b60 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
11b70 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11b80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
11b90 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
11ba0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
11bb0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
11bc0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
11bd0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
11be0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
11bf0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
11c00 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
11c10 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
11c20 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
11c30 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
11c40 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
11c50 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
11c60 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
11c70 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
11c80 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
11c90 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
11ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
11cb0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
11cc0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
11cd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11ce0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
11cf0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
11d00 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
11d10 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
11d20 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
11d30 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
11d40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
11d50 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
11d60 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
11d70 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
11d80 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
11d90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11da0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
11db0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
11dc0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
11dd0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
11de0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
11df0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11e00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11e10 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11e20 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
11e30 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
11e40 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
11e50 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
11e60 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
11e70 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
11e80 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
11e90 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
11ea0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
11eb0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
11ec0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
11ed0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
11ee0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11ef0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11f00 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
11f10 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
11f20 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
11f30 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11f40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11f50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
11f60 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
11f70 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
11f80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
11f90 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
11fa0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
11fb0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
11fc0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
11fd0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
11fe0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
11ff0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
12000 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
12010 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
12020 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
12030 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12040 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
12050 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
12060 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
12070 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
12080 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
12090 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
120a0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
120b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
120c0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
120d0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
120e0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
120f0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
12100 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
12110 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
12120 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
12130 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
12140 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
12150 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
12160 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
12170 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
12180 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
12190 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
121a0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
121b0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
121c0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
121d0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
121e0 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
121f0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
12200 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
12210 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
12220 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12230 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
12240 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
12250 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
12260 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
12270 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
12280 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
12290 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
122a0 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
122b0 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
122c0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
122d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
122e0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
122f0 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
12300 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
12310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
12320 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
12330 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
12340 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
12350 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
12360 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
12370 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
12380 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
12390 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
123a0 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
123b0 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
123c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
123d0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
123e0 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
123f0 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
12400 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12410 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
12420 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
12430 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
12440 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
12450 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
12460 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
12470 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
12480 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
12490 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
124a0 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
124b0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
124c0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
124d0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
124e0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
124f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
12500 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
12510 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
12520 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
12530 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
12540 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
12550 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
12560 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
12570 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
12580 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
12590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
125a0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
125b0 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
125c0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
125d0 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
125e0 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
125f0 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
12600 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
12610 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
12620 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12630 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
12640 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12650 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
12660 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
12670 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12680 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
12690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
126a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
126b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
126c0 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
126d0 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
126e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
126f0 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
12700 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12710 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
12720 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
12730 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
12740 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
12750 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
12760 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
12770 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
12780 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
12790 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
127a0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
127b0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
127c0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
127d0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
127e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
127f0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
12800 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
12810 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
12820 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
12830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12850 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12860 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
12870 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
12880 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
12890 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
128a0 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
128b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
128c0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
128d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
128e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
128f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12900 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
12910 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
12920 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
12930 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
12940 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
12950 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
12960 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
12970 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
12980 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
12990 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
129a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
129b0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
129c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
129d0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
129e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
129f0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
12a00 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
12a10 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
12a20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
12a30 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
12a40 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
12a50 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
12a60 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
12a70 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
12a80 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
12a90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
12aa0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
12ab0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
12ac0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
12ad0 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
12ae0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12af0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
12b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12b10 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
12b20 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
12b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
12b40 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
12b50 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
12b60 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
12b70 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
12b80 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
12b90 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
12ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
12bb0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
12bc0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
12bd0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
12be0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
12bf0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
12c00 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  , or an exclusiv
12c10 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a  e lock is not.**
12c20 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
12c30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
12c40 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
12c50 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
12c60 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74   is.** changed t
12c70 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
12c80 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
12c90 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66  eSize bytes). If
12ca0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20   the file.** on 
12cb0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
12cc0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
12cd0 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
12ce0 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
12cf0 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
12d00 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
12d10 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
12d20 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
12d30 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
12d40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
12d50 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
12d60 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
12d70 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
12d80 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
12d90 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
12da0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
12db0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
12dc0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
12dd0 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
12de0 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
12df0 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
12e00 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
12e10 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
12e20 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
12e30 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
12e40 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
12e50 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
12e60 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
12e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
12e80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12e90 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
12ea0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
12eb0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
12ec0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
12ed0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
12ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12ef0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12f00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12f10 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
12f20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12f30 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
12f40 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
12f50 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  E && isOpen(pPag
12f60 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
12f70 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
12f80 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
12f90 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
12fa0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
12fb0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
12fc0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12fd0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12fe0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
12ff0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
13000 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
13010 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
13020 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
13030 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
13040 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
13050 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
13060 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
13070 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
13080 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
13090 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
130a0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
130b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
130c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
130d0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
130e0 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
130f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13100 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13110 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
13120 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
13130 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
13140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13160 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
13170 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
13180 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
13190 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
131a0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
131b0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
131c0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
131d0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
131e0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
131f0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
13200 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
13210 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
13220 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
13230 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
13240 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
13250 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
13260 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
13270 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
13280 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
13290 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
132a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
132b0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
132c0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
132d0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
132e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
132f0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
13300 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
13310 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
13320 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
13330 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
13340 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
13350 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
13360 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
13370 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
13380 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
13390 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
133a0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
133b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
133c0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
133d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
133e0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
133f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
13400 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13410 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
13420 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
13430 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13440 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
13450 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
13460 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
13470 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
13480 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
13490 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
134a0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
134b0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
134c0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
134d0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
134e0 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
134f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
13500 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13510 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
13520 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
13530 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
13540 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13550 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
13560 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
13570 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
13580 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
13590 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
135a0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
135b0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
135c0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
135d0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
135e0 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
135f0 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
13600 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
13610 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
13620 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
13630 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
13640 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
13650 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
13660 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
13670 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
13680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
13690 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
136a0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
136b0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
136c0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
136d0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
136e0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
136f0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
13700 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
13710 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
13720 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
13730 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13740 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
13750 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
13760 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
13770 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
13780 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
13790 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
137a0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
137b0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
137c0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
137d0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
137e0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
137f0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
13800 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
13810 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
13820 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
13830 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
13840 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
13850 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
13860 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
13870 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
13880 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
13890 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
138a0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
138b0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
138c0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
138d0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
138e0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
138f0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
13900 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
13910 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
13920 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
13930 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
13940 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
13950 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
13960 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
13970 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
13980 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
13990 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
139a0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
139b0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
139c0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
139d0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
139e0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
139f0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
13a00 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
13a10 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
13a20 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
13a30 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
13a40 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
13a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13a60 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
13a70 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
13a80 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
13a90 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
13aa0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
13ab0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
13ac0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
13ad0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
13ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
13af0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
13b00 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
13b10 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
13b20 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
13b30 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13b40 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
13b50 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13b60 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
13b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
13b80 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
13b90 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
13ba0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
13bb0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
13bc0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
13bd0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
13be0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
13bf0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
13c00 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
13c10 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
13c20 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
13c30 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
13c40 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
13c50 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
13c60 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
13c70 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
13c80 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
13c90 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
13ca0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
13cb0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
13cc0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
13cd0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
13ce0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
13cf0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
13d00 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
13d10 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
13d20 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
13d30 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
13d40 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
13d50 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
13d60 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
13d70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
13d80 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
13d90 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
13da0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
13db0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
13dc0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
13dd0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
13de0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
13df0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
13e00 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
13e10 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
13e20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
13e30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13e40 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
13e50 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
13e60 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
13e70 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
13e80 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
13e90 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
13ea0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
13eb0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
13ec0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
13ed0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
13ee0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
13ef0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
13f00 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
13f10 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
13f20 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
13f30 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
13f40 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
13f50 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
13f60 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
13f70 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
13f80 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
13f90 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
13fa0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13fb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
13fc0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
13fd0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
13fe0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
13ff0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
14000 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
14010 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
14020 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
14030 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
14040 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
14050 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
14060 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14070 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
14080 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
14090 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
140a0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
140b0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
140c0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
140d0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
140e0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
140f0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
14100 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
14110 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
14120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14130 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
14140 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14150 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
14160 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
14170 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
14180 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
14190 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
141a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
141b0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
141c0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
141d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
141e0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
141f0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
14200 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14220 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
14230 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
14240 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
14250 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
14260 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
14270 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
14280 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
14290 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
142a0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
142b0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
142c0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
142d0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
142e0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
142f0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
14300 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
14310 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
14320 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
14330 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
14340 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
14350 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
14360 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
14370 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
14380 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
14390 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
143a0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
143b0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
143c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
143d0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
143e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
143f0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
14400 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
14410 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
14420 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
14430 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
14440 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
14450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
14460 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
14470 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
14480 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
14490 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
144a0 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
144b0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
144c0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
144d0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
144e0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
144f0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
14500 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
14510 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
14520 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
14530 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
14540 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
14550 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
14560 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
14570 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
14580 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
14590 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
145a0 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
145b0 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
145c0 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
145d0 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
145e0 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
145f0 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
14600 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
14610 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
14620 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
14630 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
14640 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
14650 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
14660 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
14670 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
14680 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
14690 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
146a0 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
146b0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
146c0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
146d0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
146e0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
146f0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
14700 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
14710 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
14720 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14730 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
14740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
14750 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
14760 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
14770 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
14780 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
14790 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
147a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
147b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
147c0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
147d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
147e0 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
147f0 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
14800 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
14810 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
14820 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
14830 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
14840 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
14850 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
14860 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
14870 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
14880 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
14890 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
148a0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
148b0 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
148c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
148d0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
148e0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
148f0 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
14900 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
14910 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
14920 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
14930 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
14940 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
14950 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
14960 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
14970 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
14980 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
14990 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
149a0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
149b0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
149c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
149d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
149e0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
149f0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
14a00 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
14a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
14a20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14a30 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
14a40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14a50 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
14a60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
14a70 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
14a80 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
14a90 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
14aa0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
14ab0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
14ac0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
14ad0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
14ae0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
14af0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
14b00 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14b10 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
14b20 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
14b30 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
14b40 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
14b50 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
14b60 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
14b70 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
14b80 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
14b90 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
14ba0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
14bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14bc0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
14bd0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
14be0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
14bf0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
14c00 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
14c10 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
14c20 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
14c30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14c40 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
14c50 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
14c60 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
14c70 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
14c80 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
14c90 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
14ca0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
14cb0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
14cc0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
14cd0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
14ce0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
14cf0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
14d00 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
14d10 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
14d20 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
14d30 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
14d40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
14d50 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
14d60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
14d70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
14d80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
14d90 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
14da0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
14db0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
14dc0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
14dd0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
14de0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
14df0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
14e00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
14e10 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
14e20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
14e30 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
14e40 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
14e50 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
14e60 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
14e70 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
14e80 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
14e90 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
14ea0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
14eb0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
14ec0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14ed0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
14ee0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
14ef0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
14f00 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
14f10 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
14f20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
14f30 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
14f40 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
14f50 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
14f60 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
14f70 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14f80 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
14f90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14fa0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
14fb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
14fc0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
14fd0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
14fe0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14ff0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15000 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
15010 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
15020 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15030 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
15040 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
15050 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
15060 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
15070 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
15080 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
15090 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
150a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
150b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
150c0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
150d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
150e0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
150f0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
15100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15120 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
15130 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
15140 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15150 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
15160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
15170 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
15180 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
15190 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
151a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
151b0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
151c0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
151d0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
151e0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
151f0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
15200 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
15210 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15230 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
15240 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15250 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15260 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15270 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
15280 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
15290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
152a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
152b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
152c0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
152d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
152e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
152f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15300 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
15310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
15330 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
15340 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
15350 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15360 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
15370 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
15380 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
15390 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
153a0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
153b0 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
153c0 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
153d0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
153e0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
153f0 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
15400 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
15410 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
15420 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
15430 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
15440 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
15450 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
15460 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
15470 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
15480 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
15490 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
154a0 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
154b0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
154c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
154d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
154e0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
154f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15500 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
15510 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
15520 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
15530 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
15540 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
15550 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
15560 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
15570 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
15580 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
15590 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
155a0 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
155b0 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
155c0 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
155d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
155e0 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
155f0 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
15600 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
15610 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
15620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
15630 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
15640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15660 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
15670 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
15680 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
15690 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
156a0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
156b0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
156c0 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
156d0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
156e0 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
156f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
15700 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
15710 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
15720 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
15730 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
15740 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
15750 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
15760 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
15770 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
15780 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
15790 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
157a0 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
157b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
157c0 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
157d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
157e0 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
157f0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
15800 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
15810 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
15820 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
15830 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
15840 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
15850 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
15860 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
15870 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
15880 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
15890 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
158a0 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
158b0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
158c0 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
158d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
158e0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
158f0 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
15900 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
15910 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
15920 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
15930 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
15940 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
15950 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
15960 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
15970 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
15980 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
15990 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
159a0 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
159b0 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
159c0 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
159d0 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
159e0 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
159f0 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
15a00 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
15a10 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
15a20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
15a30 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
15a40 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
15a50 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
15a60 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
15a70 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
15a80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15a90 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
15aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
15ab0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
15ac0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
15ad0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
15ae0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
15af0 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
15b00 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
15b10 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
15b20 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15b30 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
15b40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15b50 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
15b60 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
15b70 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
15b80 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
15b90 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
15ba0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
15bb0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
15bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
15bd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15be0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
15bf0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
15c00 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
15c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15c20 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
15c30 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
15c40 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
15c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15c70 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
15c80 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
15c90 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
15ca0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
15cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
15cc0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15cd0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
15ce0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
15cf0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15d00 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
15d10 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
15d20 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
15d30 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
15d40 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
15d50 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
15d60 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
15d70 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
15d80 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
15d90 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
15da0 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
15db0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15dc0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
15dd0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
15de0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
15df0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
15e00 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
15e10 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
15e20 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
15e30 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
15e40 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
15e50 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
15e60 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
15e70 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
15e80 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
15e90 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
15ea0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
15eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15ec0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
15ed0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
15ee0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
15ef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15f00 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
15f10 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
15f20 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
15f30 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
15f40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
15f50 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
15f60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15f70 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
15f80 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
15f90 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
15fa0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
15fb0 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
15fc0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
15fd0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
15fe0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
15ff0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16000 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
16010 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
16020 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
16030 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
16040 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
16050 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
16060 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
16070 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
16080 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16090 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
160a0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
160b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
160c0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
160d0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
160e0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
160f0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
16100 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
16110 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
16120 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16130 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
16140 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
16150 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
16160 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
16170 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
16180 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
16190 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
161a0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
161b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
161c0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
161d0 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d  R_SHARED && !MEM
161e0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
161f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16200 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  d) );..  if( NEV
16210 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  ER(!isOpen(pPage
16220 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61  r->fd)) ){.    a
16230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
16240 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d  empFile );.    m
16250 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
16260 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
16270 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75  eSize);.    retu
16280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16290 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
162a0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
162b0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
162c0 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
162d0 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
162e0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
162f0 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
16300 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
16310 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70  gno, &isInWal, p
16320 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
16330 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73  SQLITE_OK && !is
16350 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34  InWal ){.    i64
16360 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
16370 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16380 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
16390 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
163a0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
163b0 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20  g->pData, pgsz, 
163c0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
163d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
163e0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
163f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16400 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
16410 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
16420 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
16430 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16440 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
16450 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
16460 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
16470 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
16480 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
16490 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
164a0 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
164b0 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
164c0 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
164d0 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
164e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
164f0 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
16500 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
16510 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
16520 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
16530 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
16540 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
16550 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
16560 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
16570 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
16580 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
16590 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
165a0 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
165b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
165c0 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
165d0 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
165e0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
165f0 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
16600 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
16610 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
16620 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
16630 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
16640 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
16650 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
16660 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
16670 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
16680 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
16690 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ing equaling 16 
166a0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
166b0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
166c0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
166d0 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
166e0 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
166f0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
16700 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16710 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
16720 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
16730 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16740 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
16750 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
16760 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
16770 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
16780 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
16790 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
167a0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
167b0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
167c0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
167d0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
167e0 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
167f0 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50  ITE_NOMEM);..  P
16800 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
16810 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
16820 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
16830 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16840 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
16850 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
16860 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
16870 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
16880 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
16890 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
168b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
168c0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
168d0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
168e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
168f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16900 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
16910 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
16920 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
16930 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
16940 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
16950 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16960 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
16970 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
16980 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
16990 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
169a0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
169b0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
169c0 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
169d0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
169e0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
169f0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
16a00 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
16a10 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
16a20 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
16a30 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
16a40 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
16a50 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
16a60 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
16a70 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
16a80 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
16a90 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
16aa0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
16ab0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
16ac0 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
16ad0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
16ae0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
16af0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
16b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16b10 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
16b20 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
16b30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16b40 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
16b50 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
16b60 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
16b70 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
16b80 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
16b90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16ba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
16bb0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
16bc0 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
16bd0 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
16be0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
16bf0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
16c00 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
16c10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
16c20 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
16c30 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
16c40 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
16c50 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
16c60 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16c70 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
16c80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16ca0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
16cb0 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
16cc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16cd0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
16ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16cf0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
16d00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16d10 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
16d20 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
16d30 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
16d40 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
16d50 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
16d60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16d70 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
16d80 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
16d90 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
16da0 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
16db0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
16dc0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
16dd0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
16de0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
16df0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
16e00 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
16e10 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
16e20 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16e30 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
16e40 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
16e50 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
16e60 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
16e70 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
16e80 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
16e90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
16ea0 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
16eb0 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
16ec0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
16ed0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
16ee0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
16ef0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16f00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16f10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
16f20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
16f30 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
16f40 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
16f50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16f60 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
16f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16f80 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16fa0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
16fb0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
16fe0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
16ff0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
17000 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
17010 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
17020 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
17030 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
17040 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
17050 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
17060 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
17070 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
17080 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
17090 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
170a0 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
170b0 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
170c0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
170d0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
170e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
170f0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
17100 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
17110 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
17120 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
17130 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
17140 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
17150 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
17160 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
17170 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
17180 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
17190 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
171a0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
171b0 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
171c0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
171d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
171e0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
171f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
17200 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
17210 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
17220 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
17230 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
17240 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
17250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17260 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17270 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
17280 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
17290 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
172a0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
172b0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
172c0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
172d0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
172e0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
172f0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
17300 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
17310 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
17320 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
17330 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
17340 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
17350 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
17360 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
17370 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
173a0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
173b0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
173c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
173d0 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
173e0 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
173f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17400 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
17410 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
17420 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17430 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20  isCommit,       
17440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17450 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
17460 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
17470 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20   sync_flags     
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17490 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
174a0 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29   OsSync() (or 0)
174b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
174e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
174f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
17500 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  al );.  rc = sql
17510 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
17520 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
17530 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
17540 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
17550 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
17560 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b   sync_flags.  );
17570 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17580 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
17590 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
175a0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
175b0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
175c0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
175d0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
175e0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
175f0 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
17600 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
17610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17630 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
17640 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
17650 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
17660 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
17670 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
17680 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
17690 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
176a0 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
176b0 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
176c0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
176d0 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
176e0 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
176f0 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
17700 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
17710 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
17720 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
17730 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
17740 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
17750 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
17760 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
17770 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
17780 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
17790 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
177a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
177d0 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
177e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
177f0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
17800 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
17810 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17820 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17830 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  r) );..  /* sqli
17840 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
17850 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
17860 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
17870 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
17880 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
17890 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
178a0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
178b0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
178c0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
178d0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
178e0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
178f0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
17900 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
17910 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
17920 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
17930 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
17940 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
17950 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
17960 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
17970 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
17980 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
17990 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
179a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
179b0 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79  ){.    int dummy
179c0 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65  ;.    if( change
179d0 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  d ){.      pager
179e0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
179f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17a00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
17a10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
17a20 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  alid==0 );.    }
17a30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17a40 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17a50 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b  pPager, &dummy);
17a60 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
17a70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17a80 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  RED;..  return r
17a90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
17aa0 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
17ab0 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
17ac0 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
17ad0 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
17ae0 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e  Pager.** exists.
17af0 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
17b00 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
17b10 70 45 78 69 73 74 73 20 74 6f 20 31 20 69 66 20  pExists to 1 if 
17b20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
17b30 0a 2a 2a 20 6f 72 20 30 20 6f 74 68 65 72 77 69  .** or 0 otherwi
17b40 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  se and return SQ
17b50 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
17b60 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  O or OOM error o
17b70 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
17b80 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
17b90 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
17ba0 20 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c   int pagerHasWAL
17bb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17bc0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
17bd0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bf0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17c00 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17c30 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
17c40 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
17c50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
17c60 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33    zWal = sqlite3
17c70 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c  _mprintf("%s-wal
17c80 22 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ", pPager->zFile
17c90 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 57  name);.  if( !zW
17ca0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
17cb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
17cc0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
17cd0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
17ce0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61  Pager->pVfs, zWa
17cf0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
17d00 5f 45 58 49 53 54 53 2c 20 70 45 78 69 73 74 73  _EXISTS, pExists
17d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17d20 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20  ree(zWal);.  }. 
17d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17d40 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
17d50 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
17d60 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
17d70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
17d80 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
17d90 2a 20 65 78 69 73 74 73 2e 20 49 66 20 69 74 20  * exists. If it 
17da0 64 6f 65 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  does, open the p
17db0 61 67 65 72 20 69 6e 20 57 41 4c 20 6d 6f 64 65  ager in WAL mode
17dc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
17dd0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
17de0 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
17df0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
17e00 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 50 41  is not set to PA
17e10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
17e20 57 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  WAL..** If an IO
17e30 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   or OOM error oc
17e40 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17e50 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
17e60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17e70 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
17e80 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20  ed, also open a 
17e90 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74  snapshot (read t
17ea0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
17eb0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
17ec0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
17ed0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17ee0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
17ef0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
17f00 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
17f10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
17f20 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
17f30 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
17f40 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 2c 20 74  ete .** a WAL, t
17f50 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
17f60 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
17f70 64 69 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 74  dition between t
17f80 68 65 20 78 41 63 63 65 73 73 28 29 20 0a 2a 2a  he xAccess() .**
17f90 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
17fa0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
17fb0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 6f  ecuted by some o
17fc0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
17fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17fe0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
17ff0 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
18000 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
18010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
18020 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
18030 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
18040 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
18050 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18060 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
18070 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  ts */.    rc = p
18080 61 67 65 72 48 61 73 57 41 4c 28 70 50 61 67 65  agerHasWAL(pPage
18090 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20  r, &isWal);.    
180a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
180b0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
180c0 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
180d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
180e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
180f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18100 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
18110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18130 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18140 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
18150 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
18160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18170 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
18180 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
18190 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
181a0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
181b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
181c0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
181d0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
181e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
181f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18200 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18210 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
18220 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
18230 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
18240 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
18250 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
18260 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
18270 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
18280 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
18290 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
182a0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
182b0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
182c0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
182d0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
182e0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
182f0 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
18300 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
18310 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
18320 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
18330 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
18340 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
18350 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
18360 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
18370 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
18380 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
18390 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
183a0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
183b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
183c0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
183d0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
183e0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
183f0 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
18400 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
18410 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
18420 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
18430 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
18440 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
18450 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
18460 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18470 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
18480 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
18490 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
184a0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
184b0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
184c0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
184d0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
184e0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
184f0 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18500 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18510 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18520 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18530 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18540 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18550 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
18560 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18570 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
18580 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
18590 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
185a0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
185b0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
185c0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
185d0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
185e0 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
185f0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18600 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18610 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18620 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18630 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18640 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
18650 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
18660 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
18670 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
18680 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
18690 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
186a0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
186b0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
186c0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
186d0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
186e0 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
186f0 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18700 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18710 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18720 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18730 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18740 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18750 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
18760 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
18770 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
18780 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
18790 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
187a0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
187b0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
187c0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
187d0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
187e0 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
187f0 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18800 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18810 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18820 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18830 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18840 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18850 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
18860 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
18870 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
18880 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18890 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
188a0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
188b0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
188c0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
188d0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
188e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
188f0 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18910 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18920 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18930 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18940 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18950 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
18960 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
18970 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
18990 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
189a0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
189b0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
189c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
189d0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
189e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
189f0 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18a00 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18a10 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18a20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18a30 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18a40 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18a50 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
18a60 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18a70 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
18a80 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
18a90 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
18aa0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
18ab0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
18ac0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18ad0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18ae0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18af0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18b00 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18b10 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18b20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18b30 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18b40 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
18b50 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
18b60 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
18b70 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
18b80 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
18b90 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
18ba0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
18bb0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18bc0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18bd0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18be0 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18bf0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18c00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18c10 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18c20 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18c30 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18c40 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
18c50 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
18c60 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
18c70 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
18c80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
18c90 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
18ca0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
18cb0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
18cc0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
18cd0 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
18ce0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
18cf0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
18d00 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
18d10 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
18d20 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
18d30 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
18d40 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
18d50 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
18d60 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
18d70 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
18d80 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
18d90 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
18da0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
18db0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
18dc0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
18dd0 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
18de0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
18df0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
18e00 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
18e10 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
18e20 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
18e30 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
18e40 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
18e50 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
18e60 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
18e70 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
18e80 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
18e90 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
18ea0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
18eb0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
18ec0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
18ed0 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
18ee0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
18ef0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
18f00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
18f10 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
18f20 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18f30 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
18f40 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
18f50 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
18f60 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
18f70 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
18f80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18f90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
18fa0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
18fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18fc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18fd0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
18fe0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18ff0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19000 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19010 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19020 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19030 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19040 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19070 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
19080 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
19090 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
190a0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
190b0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
190c0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
190d0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
190e0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
190f0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
19100 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
19110 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
19120 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
19130 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
19140 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
19150 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
19160 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
19170 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
19180 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
19190 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
191a0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
191b0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
191c0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
191d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
191e0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
191f0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
19200 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
19210 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
19220 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
19230 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
19240 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
19250 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
19260 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
19270 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
19280 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
19290 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
192a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
192b0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
192c0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
192d0 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
192e0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
192f0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
19300 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
19310 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
19320 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
19330 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
19340 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19350 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
19360 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
19370 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
19380 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
19390 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
193a0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
193b0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
193c0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
193d0 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
193e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
193f0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19400 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
19410 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
19420 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
19430 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
19440 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
19450 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
19460 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
19470 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
19480 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
19490 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
194a0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
194b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
194c0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
194d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
194e0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
194f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
19500 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19510 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19520 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19530 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19540 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
19550 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
19560 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
19570 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
19580 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
19590 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
195a0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
195b0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
195c0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
195d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
195e0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
195f0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19600 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19610 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19620 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19630 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19640 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19650 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
19660 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
19670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19680 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
19690 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
196a0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
196b0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
196c0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
196d0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
196e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
196f0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19700 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19710 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19720 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19730 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19740 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19750 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
19760 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
19770 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
19780 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19790 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
197a0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
197b0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
197c0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
197d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
197e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
197f0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19810 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19820 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19830 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19840 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19850 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
19860 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
19870 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
19880 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
19890 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
198a0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
198b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
198c0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
198d0 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
198e0 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
198f0 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19900 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19910 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19920 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19930 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19940 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19950 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
19960 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
19970 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
19980 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
19990 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
199a0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
199b0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
199c0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
199d0 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
199e0 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
199f0 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19a00 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19a10 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19a20 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19a30 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19a40 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19a50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19a60 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
19a70 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
19a80 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
19a90 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
19aa0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
19ab0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
19ac0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19ad0 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19ae0 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19af0 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19b00 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19b10 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19b20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19b30 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19b40 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
19b50 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
19b60 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
19b70 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
19b80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19b90 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
19ba0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19bb0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19bc0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19bd0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19be0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19bf0 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19c00 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19c10 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19c20 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19c30 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19c40 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
19c50 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
19c60 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
19c80 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
19c90 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
19ca0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19cb0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
19cc0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
19cd0 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
19ce0 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
19cf0 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
19d00 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
19d10 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
19d20 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
19d30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
19d40 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
19d50 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
19d60 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
19d70 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
19d80 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
19d90 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
19da0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
19db0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
19dc0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
19dd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19de0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
19df0 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
19e00 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
19e10 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
19e20 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
19e30 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
19e40 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
19e50 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
19e60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19e70 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
19e80 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
19e90 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
19ea0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
19eb0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
19ec0 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
19ed0 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
19ee0 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
19ef0 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
19f00 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
19f10 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
19f20 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
19f30 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
19f40 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
19f50 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
19f60 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
19f70 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
19f80 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
19f90 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
19fa0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
19fb0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
19fc0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
19fd0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
19fe0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19ff0 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1a000 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
1a010 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1a020 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
1a030 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
1a040 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1a050 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
1a060 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
1a070 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1a080 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
1a090 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a0a0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
1a0b0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
1a0c0 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
1a0d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1a0e0 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
1a0f0 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
1a100 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
1a110 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
1a120 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
1a130 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
1a140 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
1a150 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
1a160 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1a170 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1a180 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a190 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a1a0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
1a1b0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1a1c0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
1a1d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a1e0 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
1a1f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1a200 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
1a210 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
1a220 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
1a230 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
1a240 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
1a250 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
1a260 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
1a270 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1a280 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
1a290 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1a2a0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
1a2b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a2d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1a2e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a2f0 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
1a300 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
1a310 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
1a320 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a330 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
1a340 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
1a350 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a360 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a370 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1a380 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a390 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
1a3a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a3b0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
1a3c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a3d0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
1a3e0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
1a3f0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1a400 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a410 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
1a420 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a430 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a440 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
1a450 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1a460 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
1a470 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1a480 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
1a490 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
1a4a0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1a4b0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1a4c0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1a4d0 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1a4e0 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1a4f0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1a500 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1a510 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1a520 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1a530 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1a540 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a550 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1a560 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1a570 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1a580 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1a590 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1a5a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1a5b0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1a5c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a5d0 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1a5e0 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1a5f0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1a600 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1a610 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1a620 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1a630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a660 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1a670 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1a680 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1a690 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1a6a0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1a6b0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1a6c0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1a6d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1a6e0 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1a6f0 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1a700 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1a710 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1a720 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1a730 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1a740 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1a750 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1a760 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1a770 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1a780 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1a790 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1a7a0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1a7b0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1a7c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1a7d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1a7e0 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1a7f0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1a820 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1a830 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1a840 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1a850 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1a860 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1a870 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1a880 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1a890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1a8a0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1a8b0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1a8c0 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1a8d0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1a8e0 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1a8f0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1a900 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1a910 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1a920 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1a930 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1a940 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1a950 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1a960 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1a970 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1a980 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1a990 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1a9a0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1a9b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a9c0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1a9d0 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1a9e0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1a9f0 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1aa00 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1aa10 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1aa40 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1aa50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1aa60 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1aa70 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1aa80 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1aa90 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1aaa0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1aab0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1aac0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1aad0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1aae0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1aaf0 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1ab00 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1ab10 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1ab20 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1ab30 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1ab40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1ab50 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1ab60 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1ab70 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1ab80 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1ab90 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1aba0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1abb0 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1abc0 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1abd0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1abe0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1abf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1ac00 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1ac10 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1ac20 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1ac30 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1ac40 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1ac50 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1ac60 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1ac70 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1ac80 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1ac90 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1aca0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1acb0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1acc0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1acd0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1ace0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1acf0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ad00 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1ad10 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1ad20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1ad30 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1ad40 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1ad50 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1ad60 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1ad70 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1ad80 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1ad90 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1ada0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1adb0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1adc0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1add0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1ade0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1adf0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1ae00 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1ae10 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1ae20 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1ae30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1ae40 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1ae50 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1ae60 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1ae70 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1ae80 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1ae90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1aea0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1aeb0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1aec0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1aed0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1aee0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1aef0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1af00 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1af10 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1af20 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1af30 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1af40 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1af50 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1af60 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1af70 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1af80 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1af90 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1afa0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1afb0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1afc0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1afd0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1afe0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1aff0 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1b000 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1b010 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1b020 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1b030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b040 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1b050 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1b060 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1b070 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1b080 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1b090 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1b0a0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1b0b0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1b0c0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1b0d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b0e0 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1b0f0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1b100 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1b110 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1b120 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1b130 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1b140 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1b150 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1b160 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1b170 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1b180 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1b190 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1b1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b1b0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1b1c0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b1d0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b1e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1b1f0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1b200 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1b210 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1b220 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1b230 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1b240 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1b250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b260 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1b270 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1b280 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1b290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b2a0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1b2b0 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1b2c0 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1b2d0 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1b2e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1b2f0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1b300 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1b310 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1b320 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1b330 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1b340 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1b350 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1b360 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1b370 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b380 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1b390 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1b3a0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1b3b0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1b3c0 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1b3d0 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1b3e0 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1b3f0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1b400 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1b410 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1b420 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1b430 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1b440 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1b450 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1b460 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1b470 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1b480 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1b490 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1b4a0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1b4b0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1b4c0 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1b4d0 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1b4e0 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1b4f0 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1b500 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1b510 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1b520 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1b530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b540 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1b550 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1b560 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1b570 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1b580 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1b590 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1b5a0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b5b0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1b5c0 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1b5d0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1b5e0 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1b5f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b600 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1b610 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1b620 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1b630 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1b640 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1b650 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1b660 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1b670 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1b680 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1b690 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1b6a0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1b6b0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1b6c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b6d0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1b6e0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1b6f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1b700 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1b710 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1b720 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
1b730 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20  >=nPage );.  }. 
1b740 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b750 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1b760 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1b770 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1b780 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1b790 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1b7a0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1b7b0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1b7c0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1b7d0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1b7e0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1b7f0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1b800 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1b810 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1b820 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1b830 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1b840 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1b850 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1b860 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1b870 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1b880 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1b890 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1b8a0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b8b0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1b8c0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b8d0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1b8e0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1b8f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1b900 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1b910 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1b920 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1b930 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1b940 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1b950 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1b960 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1b970 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1b980 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1b990 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1b9a0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1b9b0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1b9c0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1b9d0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1b9e0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1b9f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1ba00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1ba10 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1ba20 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1ba30 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1ba40 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1ba50 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1ba60 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1ba70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1ba80 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1ba90 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1baa0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1bab0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1bac0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1bad0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1bae0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1baf0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1bb00 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1bb10 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1bb20 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1bb30 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1bb40 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1bb50 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1bb60 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1bb70 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1bb80 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1bb90 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1bba0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1bbb0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1bbc0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1bbd0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1bbe0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1bbf0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1bc00 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1bc10 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1bc20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1bc30 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1bc40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1bc50 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1bc60 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1bc70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1bc80 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1bc90 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1bca0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1bcb0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1bcc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bcd0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1bce0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1bcf0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1bd00 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1bd10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1bd20 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1bd30 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1bd40 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1bd50 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1bd60 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1bd70 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1bd80 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1bd90 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1bda0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1bdb0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1bdc0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1bdd0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1bde0 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20  (pPager) );.#if 
1bdf0 30 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  0.  if( pagerUse
1be00 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1be10 20 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d     int isInWal =
1be20 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
1be30 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
1be40 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73  er->pWal, 1, &is
1be50 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29  InWal, N, pDest)
1be60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1be70 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57  LITE_OK || isInW
1be80 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  al ){.      retu
1be90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1bea0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1beb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1bec0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
1bed0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
1bee0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
1bef0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bf00 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1bf10 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
1bf20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1bf30 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1bf40 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1bf50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bf60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bf70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1bf80 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1bf90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bfa0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bfb0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1bfc0 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
1bfd0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
1bfe0 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
1bff0 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
1c000 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
1c010 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1c020 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
1c030 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
1c040 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
1c050 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
1c060 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
1c070 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
1c080 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1c090 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
1c0a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1c0b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1c0c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
1c0d0 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1c0e0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1c0f0 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
1c100 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
1c110 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
1c120 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
1c130 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
1c140 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c150 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
1c160 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
1c170 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
1c180 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1c190 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1c1a0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1c1b0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
1c1c0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c1d0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c1e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
1c1f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
1c200 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1c210 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
1c220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c230 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1c240 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1c250 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c260 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1c270 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
1c280 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
1c290 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
1c2a0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1c2b0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1c2c0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1c2d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c2e0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
1c2f0 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
1c300 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
1c310 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c320 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
1c330 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1c340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c350 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c360 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
1c370 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1c380 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
1c390 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1c3a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
1c3b0 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
1c3c0 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
1c3d0 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ze() */..    if(
1c3e0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1c3f0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
1c400 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c410 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OCK ){.      sql
1c420 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1c430 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61  ager->pWal, &nPa
1c440 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge);.    }..    
1c450 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1c460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1c470 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c480 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1c490 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
1c4a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c4b0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >fd) ){.        
1c4c0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
1c4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c4e0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1c4f0 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20  d, &n)) ){.     
1c500 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1c510 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c520 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c530 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c540 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1c550 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
1c560 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c570 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1c580 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c590 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1c5a0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1c5b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c5c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c5d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c5e0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c5f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c600 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1c610 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c620 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1c630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c640 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
1c650 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1c660 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1c670 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c680 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1c690 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
1c6a0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1c6b0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1c6c0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1c6d0 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1c6e0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1c6f0 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1c700 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1c710 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1c720 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1c730 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1c740 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
1c750 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1c760 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
1c770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
1c780 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1c790 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1c7a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c7b0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
1c7c0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
1c7d0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
1c7e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c7f0 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
1c800 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
1c810 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
1c820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c830 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
1c840 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
1c850 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
1c860 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c870 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
1c880 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1c890 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
1c8a0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
1c8b0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
1c8c0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
1c8d0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
1c8e0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
1c8f0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
1c900 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1c910 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
1c920 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
1c930 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
1c940 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
1c950 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1c960 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
1c970 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c980 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
1c990 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
1c9a0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
1c9b0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
1c9c0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
1c9d0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
1c9e0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
1c9f0 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
1ca00 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1ca10 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
1ca20 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
1ca30 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
1ca40 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1ca80 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
1ca90 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1caa0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1cab0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
1cac0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
1cad0 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
1cae0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1caf0 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
1cb00 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
1cb10 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1cb20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1cb30 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1cb40 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1cb50 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1cb60 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
1cb70 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
1cb80 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
1cb90 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
1cba0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1cbb0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
1cbc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1cbd0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1cbe0 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
1cbf0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
1cc00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cc10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1cc20 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1cc30 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1cc40 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
1cc50 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
1cc60 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
1cc70 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
1cc80 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
1cc90 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
1cca0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
1ccb0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
1ccc0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
1ccd0 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
1cce0 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
1ccf0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1cd00 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
1cd10 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1cd20 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
1cd30 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1cd40 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
1cd50 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
1cd60 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1cd70 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1cd80 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
1cd90 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1cda0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1cdb0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1cdc0 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
1cdd0 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
1cde0 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
1cdf0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1ce00 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
1ce10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ce20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
1ce30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ce40 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1ce50 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
1ce60 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
1ce70 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1ce80 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1ce90 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
1cea0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
1ceb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ced0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1cee0 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
1cef0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
1cf00 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
1cf10 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
1cf20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1cf30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cf40 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
1cf50 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1cf60 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
1cf70 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1cf80 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
1cf90 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
1cfa0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
1cfb0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1cfc0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
1cfd0 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
1cfe0 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
1cff0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1d000 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
1d010 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
1d020 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
1d030 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
1d040 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
1d050 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
1d060 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
1d070 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
1d080 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
1d090 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
1d0a0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1d0b0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
1d0c0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
1d0d0 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
1d0e0 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
1d0f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
1d100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1d110 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
1d120 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1d130 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
1d140 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
1d150 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
1d160 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
1d170 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
1d180 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
1d190 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
1d1a0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
1d1b0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
1d1c0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
1d1d0 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
1d1e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1d1f0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
1d200 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
1d210 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
1d220 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
1d230 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
1d240 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
1d250 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1d260 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
1d270 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1d280 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
1d290 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
1d2a0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
1d2b0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
1d2c0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
1d2d0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1d2e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d2f0 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
1d300 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
1d310 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
1d320 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
1d330 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
1d340 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
1d350 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
1d360 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
1d370 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
1d380 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
1d390 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
1d3a0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
1d3b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d3c0 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
1d3d0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d3e0 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
1d3f0 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
1d400 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d410 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
1d420 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
1d430 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
1d440 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
1d450 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1d460 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
1d470 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d480 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
1d490 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1d4a0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
1d4b0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
1d4c0 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
1d4d0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
1d4e0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1d4f0 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
1d500 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1d510 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
1d520 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
1d530 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d540 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
1d550 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
1d560 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
1d570 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
1d580 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1d590 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
1d5a0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
1d5b0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
1d5c0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
1d5d0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
1d5e0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
1d5f0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
1d600 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
1d610 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1d620 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
1d630 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1d640 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1d650 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1d660 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
1d670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d680 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
1d690 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1d6a0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
1d6b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d6c0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d6d0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
1d6e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1d6f0 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
1d700 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d710 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
1d720 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d730 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
1d740 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
1d750 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1d760 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
1d770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d780 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
1d790 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
1d7a0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
1d7b0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
1d7c0 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
1d7d0 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
1d7e0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1d7f0 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
1d800 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
1d810 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1d820 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
1d830 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
1d840 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
1d850 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1d860 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
1d870 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
1d880 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
1d890 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1d8a0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
1d8b0 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
1d8c0 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
1d8d0 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
1d8e0 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
1d8f0 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
1d900 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
1d910 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
1d920 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1d930 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
1d940 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
1d950 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1d960 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
1d970 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1d980 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d990 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1d9a0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d9b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d9c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1d9d0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d9e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d9f0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1da00 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
1da10 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
1da20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1da30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1da40 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1da50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1da60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1da70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1da80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
1da90 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
1daa0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
1dab0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
1dac0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
1dad0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
1dae0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
1daf0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
1db00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1db10 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
1db20 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1db30 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
1db40 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
1db50 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
1db60 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
1db70 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
1db80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
1db90 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
1dba0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
1dbb0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1dbc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1dbd0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
1dbe0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
1dbf0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
1dc00 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1dc10 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
1dc20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1dc30 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
1dc40 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
1dc50 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
1dc60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1dc70 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
1dc80 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
1dc90 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
1dca0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
1dcb0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
1dcc0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
1dcd0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
1dce0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1dcf0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
1dd00 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
1dd10 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
1dd20 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1dd30 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
1dd40 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1dd50 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1dd60 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1dd70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1dd80 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
1dd90 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
1dda0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1ddb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
1ddc0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
1ddd0 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
1dde0 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1ddf0 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1de00 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1de10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1de20 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1de30 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1de40 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1de50 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1de60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1de70 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1de80 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1de90 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1dea0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1deb0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1dec0 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1ded0 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1dee0 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1def0 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1df00 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1df10 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1df20 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1df30 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1df40 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1df50 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1df60 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1df70 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1df80 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1df90 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1dfa0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1dfb0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1dfc0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1dfd0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1dfe0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1dff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e000 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1e010 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1e020 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1e030 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1e040 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1e050 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1e060 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1e070 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1e080 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1e090 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1e0a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1e0b0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1e0c0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1e0d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e0e0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1e0f0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1e100 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1e110 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1e120 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
1e130 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1e140 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
1e150 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
1e160 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
1e170 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1e180 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
1e190 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
1e1a0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1e1b0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
1e1c0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
1e1d0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
1e1e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
1e1f0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
1e200 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
1e210 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
1e220 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
1e230 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
1e240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1e250 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
1e260 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1e270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e280 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
1e290 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
1e2a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1e2b0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1e2c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1e2d0 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1e2e0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
1e2f0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
1e300 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1e310 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
1e320 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e330 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
1e340 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1e350 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
1e360 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e370 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
1e380 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1e390 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
1e3a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
1e3b0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
1e3c0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
1e3d0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
1e3e0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
1e3f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1e400 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
1e410 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
1e420 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
1e430 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
1e440 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
1e450 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
1e460 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1e470 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1e480 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1e490 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
1e4a0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1e4b0 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
1e4c0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1e4d0 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
1e4e0 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
1e4f0 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a   journal-mode.**
1e500 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20   and the device 
1e510 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e520 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
1e530 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
1e540 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
1e550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e560 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
1e570 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
1e580 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
1e590 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
1e5a0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
1e5b0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
1e5c0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
1e5d0 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
1e5e0 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
1e5f0 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
1e600 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1e610 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1e620 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1e630 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
1e640 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
1e650 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1e660 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
1e670 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
1e680 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
1e690 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
1e6a0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
1e6b0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
1e6c0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
1e6d0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e6e0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
1e6f0 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
1e700 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
1e710 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
1e720 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1e730 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
1e740 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
1e750 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
1e760 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1e770 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
1e780 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
1e790 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
1e7a0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e7b0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
1e7c0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
1e7d0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
1e7e0 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
1e7f0 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
1e800 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1e810 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
1e820 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
1e830 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
1e840 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
1e850 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1e860 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
1e870 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64  * The Pager.need
1e880 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76  Sync flag is nev
1e890 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65  er be set for te
1e8a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f  mporary files, o
1e8b0 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70  r any.** file op
1e8c0 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  erating in no-sy
1e8d0 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e  nc mode (Pager.n
1e8e0 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e  oSync set to non
1e8f0 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  -zero)..**.** If
1e900 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
1e910 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
1e920 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1e930 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
1e940 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
1e950 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
1e960 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
1e970 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
1e980 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
1e990 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e9a0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
1e9b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e9c0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e9d0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1e9e0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
1e9f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ea00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
1ea10 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  dSync ){.    ass
1ea20 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1ea30 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1ea40 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ea50 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1ea60 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1ea70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eaa0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1eab0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
1eac0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1ead0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1eae0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1eaf0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1eb00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1eb10 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
1eb20 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1eb30 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1eb40 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1eb50 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
1eb60 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
1eb70 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
1eb80 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
1eb90 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
1eba0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
1ebb0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
1ebc0 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
1ebd0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
1ebe0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
1ebf0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ec00 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
1ec10 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
1ec20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
1ec30 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1ec40 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
1ec50 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
1ec60 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
1ec70 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1ec80 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
1ec90 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1eca0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
1ecb0 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
1ecc0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
1ecd0 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
1ece0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1ecf0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1ed00 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1ed10 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1ed20 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1ed30 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1ed40 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1ed50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1ed60 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1ed70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1ed80 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1ed90 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1eda0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1edb0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1edc0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1edd0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1ede0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1edf0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1ee00 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1ee10 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1ee20 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1ee30 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1ee40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1ee50 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1ee60 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1ee70 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1ee80 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1ee90 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1eea0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1eeb0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1eec0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1eed0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1eee0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1eef0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1ef00 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1ef10 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1ef20 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1ef30 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1ef40 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1ef50 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1ef60 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1ef70 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1ef80 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1ef90 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1efa0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1efb0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1efc0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1efd0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1efe0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1eff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1f000 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1f010 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1f020 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1f030 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1f040 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1f050 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1f060 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1f070 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1f080 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1f090 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1f0a0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1f0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1f0c0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1f0d0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1f0e0 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
1f0f0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
1f100 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1f110 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
1f120 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
1f130 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
1f140 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1f150 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
1f160 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1f170 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1f180 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1f190 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1f1a0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1f1b0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1f1c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1f1d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f1e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1f1f0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1f200 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1f210 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f220 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1f230 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1f240 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1f250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1f260 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1f270 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1f280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f290 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1f2a0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1f2b0 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1f2c0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1f2d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f2e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1f2f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1f300 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1f310 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f320 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f330 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f340 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1f350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f360 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1f370 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1f380 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1f390 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1f3a0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1f3b0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1f3c0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1f3d0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1f3e0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1f3f0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1f400 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1f410 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1f420 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1f430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1f440 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1f450 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1f460 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1f470 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1f480 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1f490 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1f4a0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1f4b0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1f4c0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1f4d0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1f4e0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1f4f0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1f500 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1f510 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1f520 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1f530 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1f540 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1f550 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1f560 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1f570 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1f580 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1f590 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1f5a0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1f5b0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1f5c0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f5d0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1f5e0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1f5f0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1f600 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1f610 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1f620 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1f630 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1f640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f650 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1f660 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1f670 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1f680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f6a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f6b0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1f6c0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1f6d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1f6e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1f6f0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1f700 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1f710 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1f720 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1f730 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1f740 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1f750 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
1f760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f790 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1f7a0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1f7b0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1f7c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f7d0 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1f7e0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1f7f0 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1f800 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f810 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1f820 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1f830 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1f840 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1f850 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f860 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1f870 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f880 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1f890 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1f8a0 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1f8b0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1f8c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f8d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f8f0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1f900 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1f910 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1f920 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1f930 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1f940 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1f950 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1f960 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1f970 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1f980 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1f990 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1f9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1f9b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ed = 1;.    pPag
1f9c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1f9d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f9e0 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Off;.    sqlite3
1f9f0 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
1fa00 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
1fa10 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ache);.  }..  re
1fa20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fa30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
1fa40 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
1fa50 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
1fa60 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1fa70 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
1fa80 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
1fa90 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
1faa0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
1fab0 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
1fac0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
1fad0 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
1fae0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1faf0 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
1fb00 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
1fb10 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
1fb20 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
1fb30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
1fb40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
1fb50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1fb60 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
1fb70 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
1fb80 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
1fb90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
1fba0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
1fbb0 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
1fbc0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
1fbd0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
1fbe0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
1fbf0 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
1fc00 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
1fc10 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
1fc20 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
1fc30 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1fc40 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
1fc50 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1fc60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fc70 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
1fc80 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
1fc90 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
1fca0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
1fcb0 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
1fcc0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
1fcd0 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
1fce0 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
1fcf0 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
1fd00 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
1fd10 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
1fd20 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
1fd30 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
1fd40 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
1fd50 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
1fd60 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
1fd70 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1fd80 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
1fd90 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
1fda0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
1fdb0 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
1fdc0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
1fdd0 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
1fde0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
1fdf0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1fe00 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
1fe10 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
1fe20 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
1fe30 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
1fe40 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
1fe50 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
1fe60 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
1fe70 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
1fe80 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
1fe90 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1fea0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
1feb0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
1fec0 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
1fed0 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
1fee0 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
1fef0 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
1ff00 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
1ff10 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
1ff20 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
1ff30 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
1ff40 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1ff50 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1ff60 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1ff70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1ff80 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1ff90 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
1ffa0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1ffb0 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
1ffc0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
1ffd0 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
1ffe0 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
1fff0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
20000 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20010 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
20020 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
20030 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
20040 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20060 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
20070 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
200a0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
200b0 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29   NEVER(pList==0)
200c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
200d0 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
200e0 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
200f0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
20100 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
20110 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
20120 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
20130 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
20140 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20150 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
20160 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
20170 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
20180 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73  ing.  ** call is
20190 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
201a0 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
201b0 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
201c0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
201d0 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
201e0 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
201f0 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
20200 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
20210 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
20220 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
20230 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
20240 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
20250 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
20260 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
20270 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
20280 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
20290 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
202a0 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
202b0 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
202c0 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
202d0 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
202e0 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
202f0 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
20300 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
20310 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
20320 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
20330 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
20340 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
20350 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
20360 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
20370 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
20380 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
20390 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
203a0 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
203b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
203c0 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
203d0 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
203e0 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
203f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20400 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
20410 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
20420 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
20430 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
20440 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
20450 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
20460 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61  seWal(pList->pPa
20470 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
20480 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
20490 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
204a0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
204b0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
204c0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
204d0 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OCK);..  /* If t
204e0 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
204f0 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
20500 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
20510 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
20520 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
20530 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
20540 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
20550 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
20560 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
20570 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
20580 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
20590 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
205a0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
205b0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
205c0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
205d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
205e0 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
205f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
20600 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
20610 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
20620 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
20630 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
20640 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
20650 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
20660 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
20670 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
20680 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
20690 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
206a0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
206b0 7a 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64 62  ze > (pPager->db
206c0 4f 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20 69  OrigSize+1) && i
206d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
206e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
206f0 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
20700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20710 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
20720 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
20730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
20740 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
20750 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
20760 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
20770 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  szFile);.  }..  
20780 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20790 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
207a0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
207b0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
207c0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
207d0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
207e0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
207f0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
20800 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
20810 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
20820 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
20830 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20840 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
20850 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
20860 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
20870 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
20880 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
20890 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
208a0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
208b0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
208c0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
208d0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
208e0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
208f0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
20900 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
20910 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
20920 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
20930 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
20940 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
20950 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
20960 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
20970 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
20980 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
20990 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
209a0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
209b0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
209c0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
209d0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
209e0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
209f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
20a20 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
20a30 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
20a40 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20a50 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
20a60 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
20a70 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
20a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
20a90 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
20aa0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
20ab0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
20ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20ad0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
20ae0 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
20af0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
20b00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
20b10 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
20b20 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
20b30 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
20b40 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
20b50 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
20b60 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
20b70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20b80 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
20b90 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
20ba0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
20bb0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
20bc0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
20bd0 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
20be0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
20bf0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20c00 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
20c10 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
20c20 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
20c30 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
20c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20c50 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
20c60 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
20c70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
20c80 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
20c90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20ca0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
20cb0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
20cc0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
20cd0 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
20ce0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
20cf0 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
20d00 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
20d10 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
20d20 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
20d30 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
20d40 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
20d50 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
20d70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
20d80 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
20d90 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
20da0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
20db0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
20dc0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
20dd0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
20de0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
20df0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
20e00 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
20e10 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
20e20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e30 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
20e40 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
20e50 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20e60 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
20e70 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20e80 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
20e90 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
20ea0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
20eb0 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
20ec0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
20ed0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
20ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ef0 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
20f00 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
20f10 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
20f20 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
20f30 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
20f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
20f50 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
20f60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20f70 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
20f80 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
20f90 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
20fa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
20fb0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
20fc0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
20fd0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
20fe0 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
20ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
21000 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
21010 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21020 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21030 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
21040 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
21050 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21060 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
21070 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21080 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
21090 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
210a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
210b0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
210c0 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
210d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
210e0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
210f0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
21100 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
21110 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
21120 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21130 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21140 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
21150 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
21160 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
21170 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21180 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
21190 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
211a0 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
211b0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
211c0 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
211d0 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
211e0 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
211f0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
21200 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
21210 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21220 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
21230 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
21240 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
21250 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
21260 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
21270 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21280 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
21290 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
212a0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
212b0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
212c0 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
212d0 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
212e0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
212f0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21300 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
21310 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
21320 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
21330 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
21340 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
21350 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
21360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
21370 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
21380 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
21390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
213a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
213b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
213c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
213d0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
213e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
213f0 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
21400 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
21410 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
21420 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
21430 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
21440 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
21450 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
21460 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
21470 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
21480 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
21490 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
214a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
214b0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
214c0 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
214d0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
214e0 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
214f0 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
21500 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20  urnal(pPg) .    
21510 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
21520 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
21530 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
21540 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
21550 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
21560 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
21570 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
21580 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
21590 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
215a0 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
215b0 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
215c0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
215d0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
215e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
215f0 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
21600 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
21610 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
21620 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
21630 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21640 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21650 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
21660 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
21670 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
21680 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
21690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
216a0 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
216b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
216c0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
216d0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
216e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
216f0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
21700 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
21710 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
21720 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
21730 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21750 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21760 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
21770 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
21780 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
21790 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
217a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
217b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217c0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
217d0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
217e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
217f0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
21800 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
21810 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
21820 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21830 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
21850 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21860 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
21870 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
21880 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
21890 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
218a0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
218b0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
218c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
218d0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
218e0 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
218f0 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
21900 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
21910 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
21920 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
21930 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21940 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
21950 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
21960 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
21970 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
21980 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
21990 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
219a0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
219b0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
219c0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
219d0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
219e0 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
219f0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
21a00 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
21a10 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
21a20 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
21a30 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
21a40 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
21a50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
21a60 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
21a70 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
21a80 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
21a90 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
21aa0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21ab0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
21ac0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
21ad0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
21ae0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
21af0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
21b00 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
21b10 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
21b20 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
21b30 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
21b40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21b50 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
21b60 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
21b70 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
21b80 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
21b90 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
21ba0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
21bb0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
21bc0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
21bd0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
21be0 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
21bf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21c00 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
21c10 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
21c20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21c30 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
21c40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21c50 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
21c60 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
21c70 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
21c80 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
21c90 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
21ca0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
21cb0 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75  l flag is set du
21cc0 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
21cd0 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
21ce0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
21cf0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
21d00 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
21d10 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
21d20 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
21d30 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
21d40 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
21d50 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
21d60 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
21d70 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
21d80 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
21d90 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
21da0 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
21db0 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c  flag inhibits al
21dc0 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
21dd0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
21de0 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
21df0 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
21e00 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
21e10 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  set during a rol
21e20 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
21e30 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
21e40 6f 20 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e  o inhibited when
21e50 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
21e60 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  te..  */.  if( p
21e70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
21e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21e90 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
21ea0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65  >doNotSpill ) re
21eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21ec0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
21ed0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20  NotSyncSpill && 
21ee0 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
21ef0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
21f00 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
21f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
21f20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
21f30 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
21f40 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21f50 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
21f60 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
21f70 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
21f80 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
21f90 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
21fa0 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
21fb0 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
21fc0 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
21fd0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
21fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21ff0 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
22000 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
22010 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
22020 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
22030 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
22040 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
22050 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
22060 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
22070 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
22080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
22090 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
220a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
220b0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
220c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
220d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 0a 20 20  SQLITE_OK && .  
220e0 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e        !(pPager->
220f0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
22100 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
22110 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20  EMORY) &&.      
22120 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76    !(sqlite3OsDev
22130 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
22140 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
22150 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
22160 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29  _APPEND).      )
22170 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
22180 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
22190 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
221a0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
221b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
221c0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
221d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
221e0 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
221f0 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
22200 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20  rent size of.   
22210 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
22220 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
22230 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
22240 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
22250 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69  rnal..    ** Thi
22260 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
22270 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
22280 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
22290 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
222a0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77     ** actually w
222b0 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
222c0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
222d0 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
222e0 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66  * Consider the f
222f0 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
22300 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20  e of events:.   
22310 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47   **.    **   BEG
22320 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  IN;.    **     <
22330 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
22340 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69      **     <modi
22350 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  fy page X>.    *
22360 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
22370 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sp;.    **      
22380 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
22390 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
223a0 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s>.    **       
223b0 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
223c0 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52   X).    **     R
223d0 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
223e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
223f0 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
22400 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
22410 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
22420 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
22430 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  n.    ** out to 
22440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22450 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
22460 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
22470 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20  cache. Then,.   
22480 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
22490 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
224a0 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
224b0 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
224c0 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61  l read.    ** da
224d0 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
224e0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
224f0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
22500 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
22510 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  .    ** was when
22520 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22530 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
22540 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
22550 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20  VEPOINT sp".    
22560 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
22570 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
22580 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
22590 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
225a0 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
225b0 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
225c0 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
225d0 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
225e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
225f0 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
22600 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  it will.    ** b
22610 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
22620 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
22630 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
22640 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
22650 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
22660 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
22670 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d  VER(.        rc=
22680 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
22690 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
226a0 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
226b0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
226c0 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72      ) ){.      r
226d0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
226e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
226f0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
22700 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
22710 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
22720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22730 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
22740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22750 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
22760 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
22770 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
22780 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
22790 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
227a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
227b0 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
227c0 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
227d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
227e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
227f0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
22800 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
22810 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
22820 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
22830 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
22840 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  );.}.../*.** All
22850 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
22860 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
22870 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
22880 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
22890 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
228a0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
228b0 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
228c0 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
228d0 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
228e0 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
228f0 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
22900 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
22910 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
22920 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
22930 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
22940 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
22950 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
22960 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
22970 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
22980 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
22990 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
229a0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
229b0 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
229c0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
229d0 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
229e0 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
229f0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
22a00 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
22a10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
22a20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
22a30 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
22a40 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
22a50 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
22a60 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
22a70 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
22a80 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
22a90 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
22aa0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
22ab0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
22ac0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
22ad0 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
22ae0 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
22af0 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
22b00 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
22b10 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
22b20 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
22b30 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
22b40 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
22b50 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
22b60 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
22b70 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
22b80 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
22b90 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
22ba0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
22bb0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
22bc0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
22bd0 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
22be0 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
22bf0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
22c00 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
22c10 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
22c20 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
22c30 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
22c40 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
22c50 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
22c60 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
22c70 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
22c80 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
22c90 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
22ca0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
22cb0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
22cc0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
22cd0 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
22ce0 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
22cf0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
22d00 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
22d10 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
22d20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
22d30 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
22d40 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
22d50 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
22d60 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
22d70 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
22d80 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
22d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
22da0 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
22db0 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
22dc0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
22dd0 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
22de0 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
22df0 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
22e00 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
22e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
22e20 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
22e30 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
22e40 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
22e50 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
22e60 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
22e70 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
22e80 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
22e90 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
22ea0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
22eb0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
22ec0 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
22ed0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22ee0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22ef0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
22f00 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
22f10 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
22f20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
22f30 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
22f40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
22f50 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
22f60 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
22f70 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
22f80 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
22f90 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
22fa0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
22fb0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
22fc0 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
22fd0 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
22fe0 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
22ff0 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
23000 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
23010 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23020 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
23030 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
23040 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
23050 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
23060 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
23070 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23080 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
23090 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
230a0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
230b0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
230c0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
230d0 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
230e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
230f0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
23100 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
23110 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
23120 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
23130 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
23140 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
23150 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
23160 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
23170 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
23180 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
23190 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
231a0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
231b0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
231c0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
231d0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
231e0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
231f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
23200 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
23210 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
23220 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
23230 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
23240 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
23250 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
23260 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
23270 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
23280 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
23290 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
232a0 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
232b0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
232c0 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
232d0 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
232e0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
232f0 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
23300 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50  che */.  u16 szP
23310 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
23320 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
23330 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
23340 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  page size */..  
23350 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
23360 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
23370 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
23380 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
23390 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
233a0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
233b0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
233c0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
233d0 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
233e0 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
233f0 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
23400 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
23410 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
23420 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
23430 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
23440 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
23450 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
23460 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
23470 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
23480 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
23490 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
234a0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
234b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
234c0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
234d0 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
234e0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
234f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
23500 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
23510 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
23520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
23530 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
23540 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
23550 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
23560 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
23570 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
23580 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
23590 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
235a0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
235b0 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
235c0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
235d0 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
235e0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
235f0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
23600 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
23610 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
23620 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
23630 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
23640 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
23650 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
23660 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
23670 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
23680 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
23690 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
236a0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
236b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
236c0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
236d0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
236e0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
236f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
23700 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
23710 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
23720 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
23730 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
23740 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
23750 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
23760 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
23770 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
23780 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
23790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
237a0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
237b0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
237c0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
237d0 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
237e0 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
237f0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
23800 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
23810 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
23820 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
23830 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
23840 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
23850 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
23860 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
23870 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
23880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23890 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
238a0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
238b0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
238c0 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
238d0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
238e0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
238f0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
23900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23910 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
23920 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
23930 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
23940 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
23950 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
23960 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
23970 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
23980 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
23990 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
239a0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
239b0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
239c0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
239d0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
239e0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
239f0 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
23a00 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
23a10 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
23a20 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
23a30 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
23a40 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
23a50 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
23a60 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
23a70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23a80 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
23a90 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
23aa0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
23ad0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
23ae0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23af0 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
23b00 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
23b10 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
23b20 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
23b30 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
23b40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23b50 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
23b60 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
23b70 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
23b80 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
23b90 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
23ba0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
23bb0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
23bc0 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
23be0 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
23bf0 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
23c00 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
23c10 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
23c20 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
23c30 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23c40 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
23c50 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
23c60 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
23c70 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23c80 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
23c90 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23ca0 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
23cb0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
23cc0 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
23cd0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
23ce0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
23cf0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
23d00 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
23d10 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
23d20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
23d30 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
23d40 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
23d50 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
23d60 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
23d70 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
23d80 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
23d90 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
23da0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
23db0 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
23dc0 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
23dd0 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
23de0 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
23e00 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
23e10 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
23e20 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
23e30 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
23e40 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
23e50 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
23e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23e70 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
23e80 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
23e90 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  name + 1 +      
23ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
23eb0 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
23ec0 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20  athname + 8 + 1 
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ee0 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b  zJournal */.  );
23ef0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
23f00 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
23f10 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
23f20 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
23f30 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
23f40 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
23f50 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
23f60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
23f70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
23f80 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
23f90 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
23fa0 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
23fb0 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
23fc0 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
23fd0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
23fe0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
23ff0 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
24000 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
24010 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
24020 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
24030 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
24040 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
24050 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
24060 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
24070 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
24080 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
24090 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
240a0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
240b0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
240c0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
240d0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
240e0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
240f0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
24100 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
24110 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
24120 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
24130 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
24140 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
24150 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
24160 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
24170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
24180 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
24190 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
241a0 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65  ame + 1);.    me
241b0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
241c0 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
241d0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
241e0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
241f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
24200 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
24210 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
24220 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
24230 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
24240 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20  urnal", 8);.    
24250 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  if( pPager->zFil
24260 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50  ename[0]==0 ) pP
24270 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30  ager->zJournal[0
24280 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
24290 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
242a0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
242b0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
242c0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
242d0 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
242e0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
242f0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
24300 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
24310 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
24320 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
24330 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24350 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
24360 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
24370 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
24380 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
24390 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
243a0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
243b0 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
243c0 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
243d0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
243e0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
243f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
24400 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
24410 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
24420 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
24430 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
24440 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
24450 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
24460 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
24470 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
24480 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
24490 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
244a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
244b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
244c0 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
244d0 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
244e0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
244f0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
24500 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
24510 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
24520 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
24530 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
24540 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
24550 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
24560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24570 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
24580 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63   ){.      setSec
24590 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
245a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51  .      assert(SQ
245b0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
245c0 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
245d0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
245e0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
245f0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
24600 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
24610 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24620 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
24630 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
24640 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
24650 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
24660 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
24670 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
24680 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  SIZE;.        }e
24690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
246a0 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36  zPageDflt = (u16
246b0 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
246c0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
246d0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
246e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
246f0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b  IC_WRITE.      {
24700 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63  .        int iDc
24710 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
24720 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24730 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
24740 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
24750 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
24760 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
24770 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
24780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24790 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
247a0 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
247b0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
247c0 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
247d0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
247e0 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
247f0 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
24800 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
24810 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
24820 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
24830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
24840 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
24850 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
24860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24870 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
24880 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
248a0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65  endif.    }.  }e
248b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
248c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
248d0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
248e0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
248f0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
24900 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
24910 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
24920 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
24930 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
24940 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
24950 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
24960 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
24970 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
24980 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
24990 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
249a0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
249b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
249c0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
249d0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
249e0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
249f0 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
24a00 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
24a10 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
24a20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
24a30 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
24a40 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
24a50 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
24a60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
24a70 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
24a80 55 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f  USIVE;.    readO
24a90 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
24aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24ab0 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
24ac0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
24ad0 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
24ae0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
24af0 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
24b00 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
24b10 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
24b20 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
24b30 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
24b40 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
24b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24b60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
24b70 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
24b80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24b90 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24ba0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
24bb0 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
24bc0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
24bd0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
24be0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
24bf0 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
24c00 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
24c10 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
24c20 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
24c30 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
24c40 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
24c50 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
24c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
24c70 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
24c80 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
24c90 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
24ca0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
24cb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
24cc0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
24cd0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
24ce0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
24cf0 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
24d00 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
24d10 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
24d20 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
24d30 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
24d40 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
24d50 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
24d60 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
24d70 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
24d80 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
24d90 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
24da0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
24db0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
24dc0 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
24dd0 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
24de0 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
24df0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
24e00 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
24e10 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
24e20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
24e30 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
24e40 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
24e50 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
24e60 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
24e70 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
24e80 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
24e90 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
24ea0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
24eb0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
24ec0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
24ed0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
24ee0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24ef0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
24f00 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a   (u8)memDb;.  /*
24f10 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
24f20 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
24f30 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
24f40 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
24f50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
24f60 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
24f70 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
24f80 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
24f90 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
24fa0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
24fb0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24fc0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
24fd0 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
24fe0 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
24ff0 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
25000 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
25010 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
25020 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
25030 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
25040 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
25050 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
25060 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
25070 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
25080 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
25090 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
250a0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
250b0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
250c0 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
250d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
250e0 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
250f0 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
25100 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
25110 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
25120 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
25130 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
25140 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
25150 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
25160 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
25170 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
25180 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  */.  assert( use
25190 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
251a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
251b0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
251c0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
251d0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
251e0 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
251f0 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
25200 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
25210 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
25220 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
25230 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
25240 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
25250 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
25260 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
25270 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
25280 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
25290 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
252a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
252b0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
252c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
252d0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
252e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
252f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
25300 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
25310 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
25320 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
25330 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
25340 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
25350 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
25360 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
25370 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
25380 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
25390 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
253a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
253b0 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
253c0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
253d0 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
253e0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
253f0 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
25400 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
25410 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
25420 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
25430 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
25440 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
25450 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
25460 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
25470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25480 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
25490 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
254a0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
254b0 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
254c0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
254d0 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
254e0 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
254f0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
25500 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
25510 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
25520 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
25530 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
25540 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
25550 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
25560 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
25570 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
25580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
25590 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
255a0 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
255b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
255c0 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
255d0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
255e0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
255f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
25600 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
25610 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
25620 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
25630 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
25640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25650 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
25660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25670 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
25680 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
25690 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
256a0 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
256b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
256c0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
256d0 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
256e0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
256f0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
25700 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
25710 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
25720 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
25730 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
25740 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
25750 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
25760 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
25770 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
25780 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
25790 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
257a0 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
257b0 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
257c0 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
257d0 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
257e0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
257f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
25800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
25810 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
25820 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
25830 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
25840 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
25850 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
25860 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
25870 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
25880 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
25890 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
258a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
258b0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
258c0 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
258d0 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
258e0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
258f0 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
25900 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
25910 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
25920 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
25930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25940 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
25950 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
25960 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
25970 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
25980 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
25990 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
259a0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
259b0 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
259c0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
259d0 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
259e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
259f0 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
25a00 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
25a10 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
25a20 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
25a30 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
25a40 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
25a50 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
25a60 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
25a70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
25a80 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
25a90 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
25aa0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
25ab0 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
25ac0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
25ad0 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
25ae0 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
25af0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
25b00 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
25b10 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
25b20 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
25b30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25b40 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
25b50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
25b60 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
25b70 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
25b80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
25b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25ba0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
25bb0 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
25bc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25bd0 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
25be0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
25bf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
25c00 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
25c10 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25c20 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
25c30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25c40 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41  ate <= PAGER_SHA
25c50 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
25c60 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
25c70 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
25c80 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25c90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
25ca0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
25cb0 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
25cc0 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
25cd0 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
25ce0 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
25cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25d00 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
25d10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
25d20 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
25d30 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
25d40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
25d50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
25d60 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
25d70 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20  ocked;          
25d80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25d90 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
25da0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
25db0 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
25dc0 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
25dd0 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
25de0 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
25df0 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
25e00 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
25e10 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
25e20 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
25e30 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
25e40 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
25e50 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
25e60 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
25e70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
25e80 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
25e90 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
25ea0 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
25eb0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
25ec0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
25ed0 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
25ee0 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
25ef0 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
25f00 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
25f10 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
25f20 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
25f30 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
25f40 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
25f50 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
25f60 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
25f70 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
25f80 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
25f90 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
25fa0 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
25fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
25fc0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
25fd0 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
25fe0 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
25ff0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26000 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
26010 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
26020 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  nPage;..      /*
26030 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
26040 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
26050 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
26060 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
26070 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
26080 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
26090 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
260a0 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
260b0 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
260c0 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
260d0 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
260e0 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
260f0 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
26100 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
26110 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
26120 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
26130 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69   and to avoid vi
26140 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  olating.      **
26150 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20   [H33020]..     
26160 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
26170 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
26180 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
26190 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
261a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
261b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
261c0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
261d0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
261e0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
261f0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
26200 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
26210 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
26220 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
26230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26240 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
26250 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
26260 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
26270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
26280 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
26290 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
262a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
262b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
262c0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
262d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
262e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
262f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
26300 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
26310 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
26320 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
26330 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
26340 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
26350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26360 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
26370 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
26380 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
26390 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
263a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
263b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
263c0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
263d0 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
263e0 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
263f0 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
26400 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
26410 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
26420 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
26430 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
26440 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
26450 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
26460 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
26470 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
26480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26490 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
264a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
264b0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
264c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
264d0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
264e0 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
264f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
26500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26510 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
26520 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
26530 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26540 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
26550 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
26560 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
26570 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26580 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
26590 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
265a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
265b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
265c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
265d0 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
265e0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
265f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
26600 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
26610 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26620 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
26630 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
26640 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
26650 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
26660 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
26670 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
26680 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
26690 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
266a0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
266b0 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
266c0 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
266d0 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
266e0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
266f0 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
26700 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
26710 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
26720 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
26730 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
26740 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
26750 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
26760 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
26770 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
26780 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
26790 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
267a0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
267b0 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
267c0 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
267d0 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
267e0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
267f0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
26800 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
26810 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
26820 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
26830 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
26840 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
26850 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
26860 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
26870 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
26880 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
26890 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
268a0 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
268b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
268c0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
268d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
268e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
268f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26900 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26910 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
26920 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26930 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26940 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
26950 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
26960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26970 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
26980 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
26990 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
269a0 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
269b0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
269c0 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
269d0 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
269e0 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
269f0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
26a00 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
26a10 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
26a20 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
26a30 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
26a40 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
26a50 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
26a60 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
26a70 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
26a80 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
26a90 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
26aa0 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f  UNLOCK state (no
26ab0 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
26ac0 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
26ad0 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
26ae0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
26af0 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
26b00 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
26b10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26b20 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
26b30 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
26b40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
26b50 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
26b60 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
26b70 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
26b80 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
26b90 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
26ba0 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
26bb0 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
26bc0 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
26bd0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
26be0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
26bf0 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
26c00 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
26c10 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
26c20 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
26c30 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
26c40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
26c50 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
26c60 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
26c70 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
26c80 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
26c90 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
26ca0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
26cb0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
26cc0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
26cd0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
26ce0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
26cf0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
26d00 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
26d10 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
26d20 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
26d30 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
26d40 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
26d50 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
26d60 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
26d70 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
26d80 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
26d90 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
26da0 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
26db0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
26dc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
26dd0 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62  peration describ
26de0 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20  ed by (2) above 
26df0 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
26e00 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20  , and if the.** 
26e10 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
26e20 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
26e30 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
26e40 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  L when this is c
26e50 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  alled,.** the er
26e60 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
26e70 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26e80 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65  . It is permitte
26e90 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a  d to read the.**
26ea0 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69   database when i
26eb0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72  n SQLITE_FULL er
26ec0 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
26ed0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
26ee0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
26ef0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
26f00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
26f10 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f  If an.** IO erro
26f20 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  r occurs while l
26f30 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
26f40 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
26f50 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  r a hot-journal.
26f60 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69  ** file or rolli
26f70 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
26f80 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
26f90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26fa0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
26fb0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
26fc0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
26fd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
26fe0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
26ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27000 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
27010 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d  t isErrorReset =
27020 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27030 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f   /* True if reco
27040 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f  vering from erro
27050 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
27060 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27070 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
27080 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
27090 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
270a0 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
270b0 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
270c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
270d0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
270e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
270f0 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
27100 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
27110 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
27120 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
27130 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66  Code; }..  /* If
27140 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
27150 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74  s in an error-st
27160 61 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68  ate, now is a ch
27170 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20  ance to clear.  
27180 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69  ** the error. Di
27190 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
271a0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
271b0 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61  cache and rollba
271c0 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20  ck.  ** any hot 
271d0 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66  journal in the f
271e0 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ile-system..  */
271f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
27200 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
27210 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27220 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
27230 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  >zJournal ){.   
27240 20 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20     isErrorReset 
27250 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
27260 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
27270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27280 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
27290 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
272a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
272b0 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
272c0 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
272d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
272e0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
272f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
27300 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
27310 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
27320 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
27330 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
27340 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69  ger->pVfs;.    i
27350 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  nt isHotJournal 
27360 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
27370 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
27380 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
27390 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
273a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
273b0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
273c0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
273d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
273e0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
273f0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
27400 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27410 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SHARED;.    }els
27420 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
27430 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
27440 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
27450 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
27460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27470 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
27480 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
27490 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
274a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
274b0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
274c0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
274d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
274e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
274f0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
27500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
27510 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
27520 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
27530 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
27540 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
27550 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
27560 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
27570 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
27580 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
27590 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
275a0 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b  !isErrorReset ){
275b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
275c0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20  Pager->state <= 
275d0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
275e0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
275f0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
27600 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
27610 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27630 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
27640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27650 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
27660 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
27670 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
27680 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
27690 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
276a0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
276b0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
276c0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
276d0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
276e0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
276f0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
27700 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
27710 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
27720 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
27730 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
27740 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
27750 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27760 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
27770 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
27780 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
27790 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
277a0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
277b0 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
277c0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
277d0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
277e0 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
277f0 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
27800 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
27810 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
27820 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
27830 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
27840 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
27850 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
27860 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
27870 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
27880 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
27890 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
278a0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
278b0 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
278c0 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
278d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
278e0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
278f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27900 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27910 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
27920 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
27930 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27940 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
27950 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
27960 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
27970 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27980 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27990 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
279a0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
279b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
279c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
279d0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
279e0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
279f0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
27a00 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
27a10 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27a20 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
27a30 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
27a40 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
27a50 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
27a60 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
27a70 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
27a80 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
27a90 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
27aa0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
27ab0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
27ac0 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
27ad0 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
27ae0 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
27af0 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
27b00 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
27b10 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
27b20 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
27b30 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
27b40 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
27b50 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
27b60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
27b70 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
27b80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27b90 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
27ba0 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  fs,pPager->zJour
27bb0 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53  nal,SQLITE_ACCES
27bc0 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a  S_EXISTS,&res);.
27bd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27bf0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
27c00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
27c10 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
27c20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
27c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
27c40 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
27c50 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
27c60 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
27c70 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
27c80 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
27c90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27ca0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
27cb0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
27cc0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
27cd0 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
27ce0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
27cf0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
27d00 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27d10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
27d20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27d30 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
27d40 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
27d50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
27d70 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
27d80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27d90 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27da0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
27db0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
27dc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27dd0 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
27de0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
27df0 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
27e00 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
27e10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
27e20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
27e30 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
27e40 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
27e50 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
27e60 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
27e70 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
27e80 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
27e90 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
27ea0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  it .            
27eb0 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
27ec0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
27ed0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
27ee0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
27ef0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
27f00 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
27f10 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
27f20 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
27f30 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
27f40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
27f50 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
27f60 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
27f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27f90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
27fb0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
27fc0 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
27fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74 61   the journal sta
27fe0 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69 6e  tus fields to in
27ff0 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
28000 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a  have no.      **
28010 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
28020 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  l at this time. 
28030 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
28040 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
28050 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
28060 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
28070 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
28080 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
28090 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
280a0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
280b0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
280c0 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
280d0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
280e0 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a  ced to disk. */.
280f0 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
28100 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
28110 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
28120 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
28130 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
28140 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
28150 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
28160 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
28170 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
28180 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
28190 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
281a0 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
281b0 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
281c0 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
281d0 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
281e0 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
281f0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
28200 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
28210 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
28220 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
28230 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
28240 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
28250 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
28260 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
28270 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
28280 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
28290 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
282a0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
282b0 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
282c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
282d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
282e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
282f0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
28300 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
28310 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28320 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28330 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
28340 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
28350 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
28360 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28380 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28390 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
283a0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
283b0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
283c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
283d0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
283e0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
283f0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
28400 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
28410 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
28420 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
28430 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
28440 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
28450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
28460 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50  ckup || sqlite3P
28470 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
28480 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
28490 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
284a0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
284b0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
284c0 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
284d0 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
284e0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
284f0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
28500 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
28510 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
28520 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
28530 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
28540 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
28550 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
28560 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
28570 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
28580 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
28590 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
285a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
285b0 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
285c0 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
285d0 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
285e0 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
285f0 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
28600 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
28610 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
28620 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
28630 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
28640 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
28650 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
28660 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
28670 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
28680 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
28690 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
286a0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
286b0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
286c0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
286d0 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
286e0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
286f0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
28700 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
28710 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
28720 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
28730 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
28740 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
28750 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
28760 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
28770 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
28780 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
28790 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
287a0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
287b0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
287c0 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
287d0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
287e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
287f0 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs)];.      sqli
28800 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
28810 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
28820 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
28830 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
28840 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
28850 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
28860 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
28870 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
28880 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
28890 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
288a0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
288b0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
288c0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
288d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
288e0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
288f0 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
28900 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
28910 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
28920 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28940 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
28950 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
28960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28970 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
28980 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
28990 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
289a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
289b0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
289c0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
289d0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
289e0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
289f0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
28a00 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
28a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28a20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28a30 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
28a40 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  | pPager->state=
28a50 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
28a60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
28a70 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
28a80 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
28a90 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
28aa0 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
28ab0 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
28ac0 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
28ad0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
28ae0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
28af0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
28b00 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
28b10 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ent(pPager);.  }
28b20 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
28b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28b40 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
28b50 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
28b60 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
28b70 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
28b80 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
28b90 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
28ba0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
28bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28bc0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
28bd0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
28be0 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
28bf0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
28c00 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
28c10 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
28c20 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
28c30 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
28c40 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
28c50 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
28c60 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
28c70 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
28c80 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
28c90 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
28ca0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
28cb0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
28cc0 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
28cd0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
28ce0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
28cf0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
28d00 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
28d10 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
28d20 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
28d30 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
28d40 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21  he)==0).   && (!
28d50 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
28d60 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
28d70 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
28d80 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
28d90 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
28da0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
28db0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
28dc0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
28dd0 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
28de0 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
28df0 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
28e00 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
28e10 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
28e20 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
28e30 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
28e40 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
28e50 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
28e60 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
28e70 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
28e80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
28e90 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
28ea0 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
28eb0 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
28ec0 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
28ed0 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
28ee0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
28ef0 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
28f00 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
28f10 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
28f20 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
28f30 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
28f40 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
28f50 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
28f60 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
28f70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
28f80 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
28f90 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
28fa0 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
28fb0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
28fc0 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
28fd0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
28fe0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
28ff0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
29000 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
29010 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
29020 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
29030 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
29040 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
29050 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
29060 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
29070 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
29080 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
29090 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
290a0 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
290b0 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
290c0 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
290d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
290e0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
290f0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
29100 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
29110 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
29120 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
29130 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
29140 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
29150 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
29160 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
29170 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
29180 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
29190 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
291a0 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
291b0 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
291c0 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
291d0 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
291e0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
291f0 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
29200 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
29210 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
29220 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
29230 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
29240 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
29250 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
29260 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
29270 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
29280 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
29290 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
292a0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
292b0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
292c0 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
292d0 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
292e0 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
292f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
29300 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
29310 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
29320 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
29330 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
29340 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
29350 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
29360 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
29370 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
29380 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
29390 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
293a0 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
293b0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
293c0 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
293d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
293e0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
293f0 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
29400 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
29410 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
29420 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
29430 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
29440 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
29450 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
29460 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
29470 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
29480 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
29490 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
294a0 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
294b0 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
294c0 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
294d0 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
294e0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
294f0 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
29500 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
29510 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
29520 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
29530 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
29540 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
29550 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
29560 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
29570 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
29580 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
29590 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
295a0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
295b0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
295c0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
295d0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
295e0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
295f0 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
29600 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
29610 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
29620 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
29630 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
29640 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
29650 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
29660 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
29670 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
29680 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
29690 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
296a0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
296b0 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
296c0 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
296d0 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
296e0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
296f0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
29700 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
29710 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
29720 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
29730 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
29740 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
29750 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
29760 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
29770 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
29780 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
29790 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
297a0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
297b0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
297c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
297d0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
297e0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
297f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29800 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
29810 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
29820 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
29830 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
29840 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
29850 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29860 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
29870 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
29880 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
29890 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
298a0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
298b0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
298c0 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
298d0 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
298e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
298f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
29900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29910 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c  >state>PAGER_UNL
29920 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  OCK );..  if( pg
29930 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
29940 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
29950 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
29960 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
29970 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
29980 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
29990 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
299a0 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
299b0 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
299c0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
299d0 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
299e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
299f0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
29a00 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
29a10 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
29a20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
29a30 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
29a40 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
29a50 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
29a60 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
29a70 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
29a80 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
29a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29aa0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
29ab0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
29ac0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
29ad0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
29ae0 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
29af0 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
29b00 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
29b10 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
29b20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
29b30 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
29b40 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
29b50 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
29b60 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
29b70 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
29b80 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
29b90 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
29ba0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
29bb0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
29bc0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
29bd0 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
29be0 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
29bf0 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
29c00 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
29c10 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
29c20 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
29c30 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
29c40 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
29c50 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
29c60 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
29c70 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
29c80 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
29c90 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
29ca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
29cb0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
29cc0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
29cd0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
29ce0 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   );.    PAGER_IN
29cf0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
29d00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
29d10 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
29d20 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
29d30 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
29d40 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
29d50 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
29d60 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
29d70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
29d80 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
29d90 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
29da0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
29db0 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
29dc0 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  e;.    pPg->pPag
29dd0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
29de0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
29df0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
29e00 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
29e10 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
29e20 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
29e30 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
29e40 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
29e50 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
29e60 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
29e70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
29e80 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
29e90 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
29ea0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
29eb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
29ec0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29ed0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
29ee0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
29ef0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
29f00 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29f10 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
29f20 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Max);.    if( rc
29f30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29f40 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
29f50 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
29f60 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
29f70 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70  B || nMax<(int)p
29f80 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
29f90 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
29fa0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
29fb0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
29fc0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
29fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29fe0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
29ff0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
2a000 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
2a010 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
2a020 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2a030 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
2a040 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
2a050 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
2a060 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
2a070 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
2a080 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
2a090 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
2a0a0 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
2a0b0 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
2a0c0 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
2a0d0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2a0e0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
2a0f0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
2a100 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
2a110 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
2a120 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
2a130 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2a140 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
2a150 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
2a160 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
2a170 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
2a180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2a190 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2a1a0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
2a1b0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
2a1c0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
2a1d0 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
2a1e0 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
2a1f0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
2a200 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
2a210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2a220 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
2a230 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2a240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
2a250 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
2a260 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2a270 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
2a280 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2a290 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
2a2a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2a2b0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
2a2c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2a2d0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
2a2e0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
2a2f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2a300 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2a310 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
2a320 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
2a330 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a340 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2a350 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2a360 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
2a370 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
2a380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a3a0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
2a3b0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
2a3c0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2a3d0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2a3e0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
2a3f0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
2a400 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
2a410 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a420 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
2a430 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
2a440 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2a450 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
2a460 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
2a470 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
2a480 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
2a490 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
2a4a0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
2a4b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
2a4c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
2a4d0 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
2a4e0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2a4f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2a500 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
2a510 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
2a520 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
2a530 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
2a540 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
2a550 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2a560 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
2a570 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
2a580 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
2a590 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
2a5a0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
2a5b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2a5c0 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
2a5d0 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
2a5e0 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
2a5f0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
2a600 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2a610 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2a620 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
2a630 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2a640 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
2a650 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2a660 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
2a670 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
2a680 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
2a690 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
2a6a0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2a6b0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
2a6c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
2a6d0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
2a6e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
2a6f0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
2a700 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
2a710 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
2a720 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
2a730 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
2a740 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
2a750 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
2a760 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
2a770 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
2a780 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
2a790 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
2a7a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a7b0 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
2a7c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2a7d0 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f  ->state > PAGER_
2a7e0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  UNLOCK );.  sqli
2a7f0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
2a800 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
2a810 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
2a820 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
2a830 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
2a840 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2a850 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
2a860 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2a870 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
2a880 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
2a890 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
2a8a0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
2a8b0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
2a8c0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
2a8d0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
2a8e0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
2a8f0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
2a900 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
2a910 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
2a920 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
2a930 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2a940 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
2a950 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
2a960 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a970 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2a980 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2a990 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
2a9a0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
2a9b0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
2a9c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2a9d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2a9e0 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
2a9f0 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
2aa00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
2aa10 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
2aa20 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
2aa30 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
2aa40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2aa50 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
2aa60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2aa70 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
2aa80 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2aa90 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
2aaa0 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
2aab0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
2aac0 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
2aad0 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
2aae0 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
2aaf0 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
2ab00 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
2ab10 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
2ab20 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
2ab30 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
2ab40 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
2ab50 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
2ab60 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
2ab70 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
2ab80 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
2ab90 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
2aba0 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
2abb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
2abc0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
2abd0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
2abe0 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
2abf0 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
2ac00 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
2ac10 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
2ac20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
2ac30 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
2ac40 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
2ac50 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
2ac60 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
2ac70 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
2ac80 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2ac90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2aca0 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
2acb0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
2acc0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
2acd0 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
2ace0 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
2acf0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2ad00 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2ad10 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2ad20 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
2ad30 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
2ad40 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
2ad50 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
2ad60 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
2ad70 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2ad80 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2ad90 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
2ada0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
2adb0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
2adc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2add0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
2ade0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2adf0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ae00 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae20 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2ae30 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae60 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2ae70 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
2ae80 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2ae90 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2aea0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
2aeb0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
2aec0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
2aed0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2aee0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2aef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2af00 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2af10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2af20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2af30 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2af40 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73  ODE_OFF );.  ass
2af50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
2af60 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
2af70 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
2af80 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2af90 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
2afa0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
2afb0 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
2afc0 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
2afd0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
2afe0 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
2aff0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
2b000 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
2b010 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
2b020 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2b030 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
2b040 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
2b050 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2b060 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30  ->dbSizeValid==0
2b070 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2b080 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2b090 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2b0a0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2b0b0 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
2b0c0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
2b0d0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2b0e0 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  te(nPage);.  if(
2b0f0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2b100 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  nal==0 ){.    re
2b110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b120 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  M;.  }..  /* Ope
2b130 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2b140 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
2b150 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
2b160 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2b170 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2b180 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2b190 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2b1a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2b1b0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
2b1c0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
2b1d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b1e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b1f0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
2b200 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
2b210 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2b220 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
2b230 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
2b240 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
2b250 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2b260 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
2b270 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
2b280 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
2b290 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2b2a0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
2b2b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2b2c0 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
2b2d0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2b2e0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
2b2f0 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65          );.#ifde
2b300 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b310 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2b320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2b330 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
2b340 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
2b350 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2b360 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
2b370 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
2b380 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
2b390 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
2b3a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2b3b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2b3c0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2b3d0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
2b3e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2b3f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2b400 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2b410 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2b420 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69  ;.  }...  /* Wri
2b430 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
2b440 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
2b450 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b460 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74  and open .  ** t
2b470 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
2b480 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
2b490 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2b4a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
2b4b0 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
2b4c0 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
2b4d0 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
2b4e0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2b4f0 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
2b500 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2b510 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b520 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
2b530 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2b540 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2b550 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
2b560 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b570 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Off = 0;.    pPa
2b580 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
2b590 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
2b5a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
2b5b0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
2b5c0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
2b5d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
2b5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b5f0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2b600 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
2b610 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
2b620 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b630 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  al = 0;.  }.  re
2b640 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b650 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
2b660 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
2b670 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2b680 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
2b690 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
2b6a0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2b6b0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
2b6c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b6d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2b6e0 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
2b6f0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
2b700 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
2b710 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
2b720 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
2b730 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2b740 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
2b750 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
2b760 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
2b770 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
2b780 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
2b790 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
2b7a0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
2b7b0 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
2b7c0 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
2b7d0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
2b7e0 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
2b7f0 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74  mory file and, t
2b800 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b810 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66  is .** opened if
2b820 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   it has not been
2b830 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20   already. For a 
2b840 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20  temporary file, 
2b850 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20  the opening .** 
2b860 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b870 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
2b880 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
2b890 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  n actual need to
2b8a0 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68   .** write to th
2b8b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a  e journal. TODO:
2b8c0 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70   Why handle temp
2b8d0 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66  orary files diff
2b8e0 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49  erently?.**.** I
2b8f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2b900 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72  le is opened (or
2b910 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2b920 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a  y open), then a.
2b930 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  ** journal-heade
2b940 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
2b950 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
2b960 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
2b970 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
2b980 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
2b990 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
2b9a0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
2b9b0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
2b9c0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
2b9d0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
2b9e0 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
2b9f0 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
2ba00 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
2ba10 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
2ba20 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
2ba30 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
2ba40 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2ba50 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
2ba60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
2ba70 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
2ba80 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
2ba90 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
2baa0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
2bab0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
2bac0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
2bad0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
2bae0 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
2baf0 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
2bb00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2bb10 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
2bb20 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
2bb30 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
2bb40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2bb50 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
2bb60 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
2bb70 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
2bb80 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
2bb90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2bba0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2bbb0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
2bbc0 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  K );.  pPager->s
2bbd0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
2bbe0 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
2bbf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
2bc00 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
2bc10 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
2bc20 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2bc30 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
2bc40 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
2bc50 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2bc60 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  le );..    if( p
2bc70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2bc80 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
2bc90 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
2bca0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
2bcb0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
2bcc0 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
2bcd0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
2bce0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
2bcf0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
2bd00 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
2bd10 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
2bd20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2bd30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2bd40 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
2bd50 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
2bd60 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
2bd70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
2bd80 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
2bd90 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
2bda0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
2bdb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
2bdc0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
2bdd0 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  D;.        if( r
2bde0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bdf0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2be00 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2be10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
2be20 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
2be30 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
2be40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2be50 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
2be60 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
2be70 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
2be80 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
2be90 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
2bea0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
2beb0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2bec0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2bed0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
2bee0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
2bef0 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
2bf00 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
2bf10 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
2bf20 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
2bf30 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
2bf40 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
2bf50 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
2bf60 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
2bf70 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2bf80 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
2bf90 20 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f 20   Pager.state to 
2bfa0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 77  PAGER_RESERVED w
2bfb0 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
2bfc0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  en.      ** tran
2bfd0 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
2bfe0 65 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  er to PAGER_EXCL
2bff0 55 53 49 56 45 2e 20 54 68 69 73 20 69 73 20 62  USIVE. This is b
2c000 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
2c010 20 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53   ** PAGER_EXCLUS
2c020 49 56 45 20 73 74 61 74 65 20 74 68 65 20 63 6f  IVE state the co
2c030 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
2c040 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
2c050 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ctions.      ** 
2c060 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
2c070 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
2c080 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
2c090 62 61 73 65 20 66 69 6c 65 20 61 73 20 77 65 6c  base file as wel
2c0a0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 6e  l.      ** as in
2c0b0 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
2c0c0 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
2c0d0 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 57  e incorrect in W
2c0e0 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
2c0f0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2c100 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
2c110 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
2c120 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
2c130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c140 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2c150 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c160 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
2c170 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ze;.        pPag
2c180 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2c190 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
2c1a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2c1b0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
2c1c0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
2c1d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2c1e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
2c1f0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
2c200 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
2c210 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2c220 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
2c230 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
2c240 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c250 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
2c260 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
2c270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c280 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
2c290 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
2c2a0 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
2c2b0 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
2c2c0 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
2c2d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2c2e0 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
2c2f0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
2c300 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
2c310 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
2c320 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
2c330 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
2c340 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
2c350 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
2c360 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
2c370 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2c380 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
2c390 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
2c3a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
2c3b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c3c0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2c3d0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c3e0 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
2c3f0 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
2c400 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c410 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
2c420 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
2c430 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2c440 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c450 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e    }..    /* No n
2c460 65 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  eed to open the 
2c470 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
2c480 74 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77  this time.  It w
2c490 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70  ill be.    ** op
2c4a0 65 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69  ened before it i
2c4b0 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49  s written to.  I
2c4c0 66 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69  f we defer openi
2c4d0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a  ng the journal,.
2c4e0 20 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20      ** we might 
2c4f0 73 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66  save the work of
2c500 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
2c510 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
2c520 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20  ion.    ** ends 
2c530 75 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70  up being a no-op
2c540 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65  ..    */.  }else
2c550 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
2c560 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
2c570 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
2c580 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
2c590 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
2c5a0 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
2c5b0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
2c5c0 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20  mode the last.  
2c5d0 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
2c5e0 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
2c5f0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
2c600 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
2c610 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
2c620 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
2c630 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
2c640 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
2c650 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
2c660 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
2c670 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63  either was trunc
2c680 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20  ated to 0 bytes 
2c690 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61  or its header wa
2c6a0 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69  s.    ** overwri
2c6b0 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tten with zeros.
2c6c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2c6d0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2c6e0 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
2c6f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c700 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
2c710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c720 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
2c730 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2c740 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2c750 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2c760 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
2c770 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
2c780 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2c790 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
2c7a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2c7b0 72 29 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  r)));.  if( rc!=
2c7c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c7d0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2c7e0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
2c7f0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e      /* Ignore an
2c800 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20  y IO error that 
2c810 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61  occurs within pa
2c820 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2c830 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 2a  ion(). The.    *
2c840 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  * purpose of thi
2c850 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73  s call is to res
2c860 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
2c870 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
2c880 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 79  er.    ** sub-sy
2c890 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74  stem. It doesn't
2c8a0 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 6a   matter if the j
2c8b0 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
2c8c0 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20  ot properly.    
2c8d0 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20  ** finalized at 
2c8e0 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63  this point (sinc
2c8f0 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61  e it is not a va
2c900 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
2c910 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f   anyway)..    */
2c920 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74  .    pager_end_t
2c930 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2c940 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r, 0);.  }.  ret
2c950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c960 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
2c970 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
2c980 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
2c990 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2c9a0 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
2c9b0 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
2c9c0 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
2c9d0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
2c9e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2c9f0 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
2ca00 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
2ca10 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
2ca20 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
2ca30 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
2ca40 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
2ca50 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
2ca60 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
2ca70 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
2ca80 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
2ca90 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
2caa0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2cab0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
2cac0 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
2cad0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2cae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2caf0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2cb00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cb10 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
2cb20 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
2cb30 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61  led unless a tra
2cb40 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2cb50 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73  eady been.  ** s
2cb60 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  tarted..  */.  a
2cb70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2cb80 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2cb90 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
2cba0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65   an error has be
2cbb0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
2cbc0 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74  tected, report t
2cbd0 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20  he same error.  
2cbe0 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  ** again..  */. 
2cbf0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2cc00 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72  r->errCode) )  r
2cc10 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2cc20 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67  rCode;..  /* Hig
2cc30 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
2cc40 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  es never call th
2cc50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64  is function if d
2cc60 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20  atabase is not. 
2cc70 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42   ** writable.  B
2cc80 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c  ut check anyway,
2cc90 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74   just for robust
2cca0 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
2ccb0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61  EVER(pPager->rea
2ccc0 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  dOnly) ) return 
2ccd0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20  SQLITE_PERM;..  
2cce0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2ccf0 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
2cd00 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
2cd10 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
2cd20 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
2cd30 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
2cd40 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
2cd50 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
2cd60 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
2cd70 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
2cd80 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
2cd90 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2cda0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
2cdb0 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
2cdc0 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
2cdd0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2cde0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2cdf0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2ce00 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
2ce10 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
2ce20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
2ce30 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
2ce40 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
2ce50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
2ce60 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
2ce70 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
2ce80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
2ce90 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
2cea0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
2ceb0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
2cec0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67     **.    ** Hig
2ced0 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
2cee0 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
2cef0 6c 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61  lready started a
2cf00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
2cf10 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73    ** which means
2cf20 20 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69   they have acqui
2cf30 72 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  red the necessar
2cf40 79 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20  y locks but the 
2cf50 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
2cf60 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
2cf70 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t yet be open.. 
2cf80 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2cf90 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
2cfa0 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67  (pPager, 0, pPag
2cfb0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2cfc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2cfd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cfe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cff0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
2d000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2d010 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2d020 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2d030 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2d040 4f 46 46 20 0a 20 20 20 20 20 26 26 20 21 70 61  OFF .     && !pa
2d050 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2d060 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  ).    ){.      a
2d070 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2d080 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2d090 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
2d0a0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
2d0b0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2d0c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2d0d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2d0e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
2d0f0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
2d100 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
2d110 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
2d120 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
2d130 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
2d140 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
2d150 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
2d160 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2d170 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
2d180 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
2d190 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
2d1a0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
2d1b0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
2d1c0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
2d1d0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
2d1e0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
2d1f0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2d200 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
2d210 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
2d220 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2d230 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
2d240 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
2d250 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
2d260 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
2d270 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2d280 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  2;..        /* W
2d290 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
2d2a0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
2d2b0 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
2d2c0 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
2d2d0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
2d2e0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
2d2f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
2d300 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
2d310 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
2d320 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
2d330 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
2d340 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
2d350 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
2d360 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d370 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d380 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
2d390 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
2d3a0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2d3b0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
2d3c0 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
2d3d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
2d3e0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
2d3f0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
2d400 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
2d410 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
2d420 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2d430 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
2d440 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d450 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
2d460 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2d470 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d490 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2d4a0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
2d4b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2d4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d4e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d4f0 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f + 4);.        
2d500 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d510 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
2d520 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
2d530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2d560 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2d570 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2d580 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
2d590 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
2d5a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d5b0 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  Off += 4;.      
2d5c0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
2d5d0 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
2d5e0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
2d5f0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
2d600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d610 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d620 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
2d630 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
2d640 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
2d650 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2d660 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
2d670 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
2d680 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2d690 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
2d6a0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2d6b0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
2d6c0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2d6d0 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
2d6e0 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
2d6f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2d700 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
2d710 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
2d720 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
2d730 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
2d740 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
2d750 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  red while journa
2d760 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
2d770 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
2d780 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
2d790 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
2d7a0 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
2d7b0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
2d7c0 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
2d7d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2d7e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
2d7f0 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
2d800 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
2d810 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
2d820 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
2d830 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
2d840 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
2d850 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2d860 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
2d870 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2d880 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
2d890 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
2d8a0 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
2d8b0 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
2d8c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2d8d0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
2d8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2d8f0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
2d900 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2d910 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2d920 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2d930 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2d940 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
2d950 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e 67  occurred writing
2d960 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2d970 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
2d980 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
2d990 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
2d9a0 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
2d9b0 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
2d9c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2d9d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d9e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2d9f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2da00 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
2da10 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
2da20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2da30 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
2da40 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2da50 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
2da60 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2da70 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
2da80 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2da90 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
2daa0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
2dab0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2dac0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
2dad0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
2dae0 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
2daf0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2db00 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2db10 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
2db20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2db30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2db40 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
2db50 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
2db60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2db70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2db80 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
2db90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2dba0 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
2dbb0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2dbc0 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
2dbd0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
2dbe0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
2dbf0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2dc00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2dc10 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2dc20 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
2dc30 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
2dc40 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2dc50 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2dc60 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2dc70 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
2dc80 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
2dc90 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
2dca0 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
2dcb0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2dcc0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
2dcd0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
2dce0 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
2dcf0 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
2dd00 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
2dd10 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
2dd20 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
2dd30 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
2dd40 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
2dd50 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
2dd60 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
2dd70 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
2dd80 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
2dd90 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
2dda0 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
2ddb0 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
2ddc0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
2ddd0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2dde0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2ddf0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
2de00 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2de10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
2de20 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
2de30 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
2de40 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rn..  */.  asser
2de50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2de60 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
2de70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2de80 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
2de90 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2dea0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
2deb0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
2dec0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
2ded0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
2dee0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
2def0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
2df00 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
2df10 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
2df20 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
2df30 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
2df40 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
2df50 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
2df60 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
2df70 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
2df80 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
2df90 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
2dfa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2dfb0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
2dfc0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
2dfd0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
2dfe0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
2dff0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
2e000 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
2e010 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
2e020 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
2e030 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
2e040 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
2e050 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
2e060 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
2e070 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
2e080 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
2e090 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
2e0a0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2e0b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
2e0c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2e0d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2e0e0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
2e0f0 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
2e100 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2e110 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
2e120 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
2e130 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
2e140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e150 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
2e160 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
2e170 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e180 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
2e190 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
2e1a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2e1b0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
2e1c0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
2e1d0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
2e1e0 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
2e1f0 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e  eSize);..  if( n
2e200 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
2e210 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
2e220 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
2e230 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2e240 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
2e250 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e260 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
2e270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e280 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
2e290 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
2e2a0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
2e2b0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b    int nPage = 0;
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e2d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
2e2e0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
2e2f0 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
2e300 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2e310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2e320 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2e330 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
2e340 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
2e350 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
2e360 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
2e370 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
2e380 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
2e390 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e  Spill flag to 1.
2e3a0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2e3b0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
2e3c0 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  .    ** a journa
2e3d0 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  l header to be w
2e3e0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
2e3f0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
2e400 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69  ed by.    ** thi
2e410 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
2e420 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
2e430 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
2e440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
2e450 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29  otSyncSpill==0 )
2e460 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
2e470 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a  NotSyncSpill++;.
2e480 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
2e490 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
2e4a0 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
2e4b0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
2e4c0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
2e4d0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
2e4e0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
2e4f0 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
2e500 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
2e510 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
2e520 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
2e530 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
2e540 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
2e550 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
2e560 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
2e570 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
2e580 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2e590 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2e5a0 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  t(pPager, (int *
2e5b0 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20  )&nPageCount);. 
2e5c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e5d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
2e5e0 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
2e5f0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
2e600 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
2e610 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
2e620 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2e630 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
2e640 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
2e650 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67   ){.        nPag
2e660 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
2e670 2d 70 67 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -pg1;.      }els
2e680 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  e{.        nPage
2e690 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
2e6a0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
2e6b0 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
2e6c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
2e6d0 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
2e6e0 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 67        assert((pg
2e6f0 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
2e700 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
2e710 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
2e720 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
2e730 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
2e740 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
2e750 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
2e760 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
2e770 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
2e780 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
2e790 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
2e7a0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
2e7b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
2e7c0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2e7d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
2e7e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e7f0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2e800 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
2e810 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2e820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e830 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
2e840 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
2e850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e860 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
2e870 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
2e880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e890 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2e8a0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2e8b0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
2e8c0 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
2e8d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2e8e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2e8f0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
2e900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2e910 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e920 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
2e930 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
2e940 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
2e950 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
2e960 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2e970 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
2e980 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2e990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2e9a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2e9b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
2e9c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2e9d0 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
2e9e0 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
2e9f0 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
2ea00 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
2ea10 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
2ea20 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
2ea30 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
2ea40 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
2ea50 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
2ea60 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
2ea70 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
2ea80 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
2ea90 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
2eaa0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
2eab0 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
2eac0 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
2ead0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
2eae0 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
2eaf0 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
2eb00 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2eb10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2eb20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2eb30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2eb40 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
2eb50 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2eb60 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
2eb70 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
2eb80 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
2eb90 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2eba0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
2ebb0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
2ebc0 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
2ebd0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2ebe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2ebf0 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
2ec00 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
2ec10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ec20 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
2ec30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ec40 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2ec50 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
2ec60 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
2ec70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ec80 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
2ec90 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
2eca0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d  >doNotSyncSpill-
2ecb0 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
2ecc0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2ecd0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
2ece0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ecf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2ed00 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
2ed10 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
2ed20 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
2ed30 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
2ed40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ed50 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
2ed60 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
2ed70 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
2ed80 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
2ed90 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
2eda0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
2edb0 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
2edc0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2edd0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
2ede0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61   return pPg->fla
2edf0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a  gs&PGHDR_DIRTY;.
2ee00 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2ee10 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
2ee20 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
2ee30 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
2ee40 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2ee50 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
2ee60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
2ee70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
2ee80 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
2ee90 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
2eea0 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
2eeb0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68  ed as dirty.  Th
2eec0 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
2eed0 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a  example, when.**
2eee0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
2eef0 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65  en added as a le
2ef00 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  af of the freeli
2ef10 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a  st and so its.**
2ef20 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67   content no long
2ef30 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a  er matters..**.*
2ef40 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
2ef50 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
2ef60 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
2ef70 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
2ef80 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
2ef90 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
2efa0 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72  nused. The pager
2efb0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
2efc0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
2efd0 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
2efe0 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
2eff0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
2f000 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
2f010 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
2f020 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
2f030 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a  peed of large .*
2f040 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  * DELETE operati
2f050 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ons..*/.void sql
2f060 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
2f070 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
2f080 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2f090 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2f0a0 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
2f0b0 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
2f0c0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2f0d0 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41  int==0 ){.    PA
2f0e0 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f  GERTRACE(("DONT_
2f0f0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
2f100 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
2f110 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
2f120 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  r)));.    IOTRAC
2f130 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
2f140 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
2f150 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d  >pgno)).    pPg-
2f160 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
2f170 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64  DONT_WRITE;.#ifd
2f180 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
2f190 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
2f1a0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
2f1b0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
2f1c0 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
2f1d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f1e0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
2f1f0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2f200 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f210 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
2f220 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
2f230 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
2f240 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2f250 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
2f260 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
2f270 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
2f280 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
2f290 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
2f2a0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
2f2b0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
2f2c0 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2f2d0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2f2e0 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
2f2f0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
2f300 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
2f310 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
2f320 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
2f330 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
2f340 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
2f350 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2f360 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
2f370 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
2f380 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f  tMode flag may o
2f390 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  nly be non-zero 
2f3a0 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77  if the library w
2f3b0 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77  as compiled.** w
2f3c0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
2f3d0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2f3e0 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  TE macro defined
2f3f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2f400 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69  ** if isDirect i
2f410 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2f420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f430 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69  le is updated di
2f440 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69  rectly.** by wri
2f450 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20  ting an updated 
2f460 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
2f470 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  1 using a call t
2f480 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  o the .** sqlite
2f490 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74  3OsWrite() funct
2f4a0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2f4b0 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
2f4c0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
2f4d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
2f4e0 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20  sDirectMode){.  
2f4f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2f500 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72  OK;..  /* Declar
2f510 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2f520 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
2f530 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66  r 'isDirect'. If
2f540 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63   the.  ** atomic
2f550 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2f560 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69  ion is enabled i
2f570 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68  n this build, th
2f580 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a  en isDirect.  **
2f590 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2f5a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
2f5b0 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72  sed as the isDir
2f5c0 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  ectMode paramete
2f5d0 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66  r.  ** to this f
2f5e0 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69  unction. Otherwi
2f5f0 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  se, it is always
2f600 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20   set to zero..  
2f610 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61  **.  ** The idea
2f620 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20   is that if the 
2f630 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2f640 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74  imization is not
2f650 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74  .  ** enabled at
2f660 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
2f670 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20  he compiler can 
2f680 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f  omit the tests o
2f690 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74  f.  ** 'isDirect
2f6a0 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c  ' below, as well
2f6b0 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e   as the block en
2f6c0 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20  closed in the.  
2f6d0 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74  ** "if( isDirect
2f6e0 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20   )" condition.. 
2f6f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2f700 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2f710 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20  _WRITE.# define 
2f720 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20  DIRECT_MODE 0.  
2f730 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
2f740 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  Mode==0 );.  UNU
2f750 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
2f760 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c  DirectMode);.#el
2f770 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45  se.# define DIRE
2f780 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74  CT_MODE isDirect
2f790 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61  Mode.#endif..  a
2f7a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2f7b0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2f7c0 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70  RVED );.  if( !p
2f7d0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2f7e0 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
2f7f0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
2f800 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
2f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f820 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
2f830 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33  page 1 */.    u3
2f840 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
2f850 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
2f860 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
2f870 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
2f880 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ield */..    ass
2f890 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
2f8a0 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e  mpFile && isOpen
2f8b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2f8c0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
2f8d0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
2f8e0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
2f8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f900 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2f910 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
2f920 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72    assert( pPgHdr
2f930 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
2f940 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
2f950 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20  If page one was 
2f960 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66  fetched successf
2f970 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66  ully, and this f
2f980 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  unction is not. 
2f990 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20     ** operating 
2f9a0 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20  in direct-mode, 
2f9b0 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74  make page 1 writ
2f9c0 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20  able.  When not 
2f9d0 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  in .    ** direc
2f9e0 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69  t mode, page 1 i
2f9f0 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e  s always held in
2fa00 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65   cache and hence
2fa10 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a   the PagerGet().
2fa20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20      ** above is 
2fa30 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75  always successfu
2fa40 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c  l - hence the AL
2fa50 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49  WAYS on rc==SQLI
2fa60 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20  TE_OK..    */.  
2fa70 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f    if( !DIRECT_MO
2fa80 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d  DE && ALWAYS(rc=
2fa90 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
2faa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fab0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
2fac0 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
2fad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fae0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  K ){.      /* In
2faf0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2fb00 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
2fb10 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
2fb20 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
2fb30 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2fb40 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
2fb50 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
2fb60 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
2fb70 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2fb80 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33  er++;.      put3
2fb90 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
2fba0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c  gHdr->pData)+24,
2fbb0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
2fbc0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f  ;..      /* Also
2fbd0 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
2fbe0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
2fbf0 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
2fc00 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a   and in.      **
2fc10 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
2fc20 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
2fc30 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
2fc40 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
2fc50 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ber.      ** is 
2fc60 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  valid. */.      
2fc70 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fc80 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2fc90 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
2fca0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33  ter);.      put3
2fcb0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
2fcc0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c  gHdr->pData)+96,
2fcd0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
2fce0 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20  NUMBER);..      
2fcf0 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
2fd00 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
2fd10 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2fd20 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
2fd30 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
2fd40 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45   if( DIRECT_MODE
2fd50 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2fd60 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20  t void *zBuf;.  
2fd70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2fd80 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2fd90 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  >0 );.        CO
2fda0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
2fdb0 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36  Hdr->pData, 1, 6
2fdc0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
2fdd0 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  M, zBuf);.      
2fde0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fdf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2fe00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2fe10 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2fe20 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2fe30 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2fe40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2fe50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fe60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2fe70 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2fe80 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2fe90 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2fea0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2feb0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2fec0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2fed0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
2fee0 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
2fef0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
2ff00 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2ff10 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
2ff20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ff30 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
2ff40 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
2ff50 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
2ff60 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
2ff70 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
2ff80 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
2ff90 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
2ffa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
2ffb0 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
2ffc0 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
2ffd0 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
2ffe0 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
2fff0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
30000 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
30010 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
30020 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30040 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
30050 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30060 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
30070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30080 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
30090 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  */.  assert( !ME
300a0 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
300b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
300c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
300d0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
300e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
300f0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
30100 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
30110 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
30120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
30130 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
30140 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
30150 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
30160 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
30170 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
30180 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
30190 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
301a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
301b0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
301c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
301d0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
301e0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
301f0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
30200 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
30210 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
30220 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
30230 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
30240 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
30250 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
30260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
30270 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
30280 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
30290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
302a0 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
302b0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
302c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
302d0 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
302e0 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
302f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
30300 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
30310 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
30320 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
30330 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
30340 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
30350 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30360 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
30370 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
30380 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
30390 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
303a0 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
303b0 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
303c0 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
303d0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
303e0 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
303f0 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
30400 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
30410 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
30420 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
30430 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
30440 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
30450 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
30460 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
30470 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
30480 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
30490 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
304a0 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
304b0 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
304c0 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
304d0 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
304e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
304f0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
30500 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
30510 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
30520 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
30530 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
30540 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
30550 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
30560 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
30570 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
30580 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
30590 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
305a0 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
305b0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
305c0 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
305d0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
305e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
305f0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
30600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
30610 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
30620 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
30630 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
30640 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
30650 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30670 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
30680 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
30690 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
306a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
306b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
306c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
306d0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69  ..  /* The dbOri
306e0 67 53 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73  gSize is never s
306f0 65 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  et if journal_mo
30700 64 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65  de=OFF */.  asse
30710 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
30720 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
30730 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
30740 7c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  | pPager->dbOrig
30750 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Size==0 );..  /*
30760 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   If a prior erro
30770 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f  r occurred, repo
30780 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67  rt that error ag
30790 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ain. */.  if( pP
307a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
307b0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
307c0 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52  rrCode;..  PAGER
307d0 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
307e0 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
307f0 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
30800 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
30810 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
30820 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
30830 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69  ->dbSize));..  i
30840 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
30850 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
30860 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
30870 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
30880 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
30890 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
308a0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
308b0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
308c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
308d0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
308e0 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
308f0 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
30900 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
30910 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
30920 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
30930 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
30940 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
30950 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
30960 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
30970 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
30980 53 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72  SYNCED && pPager
30990 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
309a0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
309b0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
309c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73       PgHdr *pLis
309d0 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
309e0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
309f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
30a00 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
30a10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
30a20 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
30a30 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65  er, pList, pPage
30a40 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20  r->dbSize, 1, . 
30a50 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
30a60 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70  er->fullSync ? p
30a70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
30a80 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29  s : 0).        )
30a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30aa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30ab0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
30ac0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
30ad0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
30ae0 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  he);.      }.   
30af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
30b00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
30b10 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
30b20 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
30b30 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
30b40 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68        ** does th
30b50 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
30b60 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
30b70 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
30b80 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
30b90 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
30ba0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
30bb0 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
30bc0 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
30bd0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75  the .      ** ru
30be0 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
30bf0 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
30c00 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ion: .      **. 
30c10 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65       **    * The
30c20 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
30c30 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
30c40 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
30c50 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  for.      **    
30c60 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
30c70 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
30c80 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
30c90 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
30ca0 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
30cb0 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
30cc0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  on, and.      **
30cd0 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
30ce0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
30cf0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
30d00 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
30d10 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
30d20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
30d30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
30d40 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
30d50 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
30d60 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hen the.      **
30d70 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
30d80 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
30d90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
30da0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
30db0 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75  nge.      ** cou
30dc0 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63  nter in 'indirec
30dd0 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20  t-mode'. If the 
30de0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
30df0 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a  compiled in but.
30e00 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
30e10 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68  applicable to th
30e20 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
30e30 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72  call sqlite3Jour
30e40 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20  nalCreate().    
30e50 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72    ** to make sur
30e60 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
30e70 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  le has actually 
30e80 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68  been created, th
30e90 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a  en call.      **
30ea0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
30eb0 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
30ec0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
30ed0 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
30ee0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  rect.      ** mo
30ef0 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  de. .      **.  
30f00 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
30f10 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
30f20 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
30f30 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
30f40 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  able,.      ** t
30f50 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
30f60 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
30f70 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
30f80 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
30f90 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69  .      ** in 'di
30fa0 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74  rect' mode. In t
30fb0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
30fc0 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
30fd0 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a  ever be.      **
30fe0 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
30ff0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
31000 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66       */.  #ifdef
31010 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
31020 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
31030 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
31040 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
31050 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31060 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
31070 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
31080 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
31090 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
310a0 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
310b0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
310c0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
310d0 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
310e0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
310f0 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
31100 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
31110 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  er->dbFileSize. 
31120 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50        && (0==(pP
31130 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
31140 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
31150 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20  r->pPCache)) || 
31160 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a  0==pPg->pDirty).
31170 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
31180 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
31190 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
311a0 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
311b0 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
311c0 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  d. The .        
311d0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
311e0 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
311f0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
31200 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
31210 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
31220 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
31230 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
31240 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
31250 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
31260 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
31270 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
31280 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
31290 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
312a0 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ite .        ** 
312b0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
312c0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
312d0 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
312e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
312f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
31300 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
31310 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
31320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
31340 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
31350 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31380 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
31390 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
313a0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
313b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23     }.      }.  #
313c0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
313d0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
313e0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
313f0 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
31400 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31410 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
31420 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
31430 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
31440 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
31450 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
31460 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
31470 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
31480 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  s.      ** being
31490 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
314a0 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
314b0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
314c0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
314d0 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
314e0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
314f0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
31500 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ode..      **.  
31510 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65      ** Before re
31520 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20  ading the pages 
31530 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
31540 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
31550 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  e .      ** curr
31560 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
31570 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
31580 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
31590 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
315a0 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
315b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
315c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
315d0 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
315e0 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
315f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31600 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
31610 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
31620 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69   .      ** readi
31630 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
31640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
31650 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31660 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  * When journal_m
31670 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f  ode==OFF the dbO
31680 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79  rigSize is alway
31690 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a  s zero, so this.
316a0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e        ** block n
316b0 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75  ever runs if jou
316c0 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20  rnal_mode=OFF.. 
316d0 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65       */.  #ifnde
316e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
316f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
31700 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
31710 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
31720 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20  Size .       && 
31730 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
31740 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
31750 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
31760 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  F).      ){.    
31770 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20      Pgno i;     
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
317a0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
317b0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  le */.        co
317c0 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
317d0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
317e0 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
317f0 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
31800 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67          const Pg
31810 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
31820 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
31830 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
31840 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
31850 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
31860 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
31870 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
31880 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b    for( i=dbSize+
31890 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62  1; i<=pPager->db
318a0 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  OrigSize; i++ ){
318b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
318c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
318d0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
318e0 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69  rnal, i) && i!=i
318f0 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
31900 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
31910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31920 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
31930 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31940 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31950 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
31960 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
31970 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31980 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31990 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
319a0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
319b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
319c0 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
319d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
319e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
319f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31a00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31a10 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
31a20 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
31a30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31a40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31a50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
31a60 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d   dbSize;.      }
31a70 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20   .  #endif.  .  
31a80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
31a90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
31aa0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
31ab0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
31ac0 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a   master .      *
31ad0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
31ae0 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
31af0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
31b00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31b10 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  , .      ** or i
31b20 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c  f zMaster is NUL
31b30 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  L (no master jou
31b40 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73  rnal), then this
31b50 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
31b60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31b70 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
31b80 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
31b90 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
31ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31bb0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31bc0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31bd0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e  .  .      /* Syn
31be0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
31bf0 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
31c00 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
31c10 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
31c20 20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68       ** used, th
31c30 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
31c40 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
31c50 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
31c60 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  orm any.      **
31c70 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20   real IO..      
31c80 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  */.      rc = sy
31c90 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
31ca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31cc0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31cd0 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
31ce0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
31cf0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
31d00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31d10 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
31d20 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
31d30 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
31d40 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
31d50 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
31d60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31d80 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
31d90 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
31da0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  D );.        got
31db0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31dc0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
31dd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
31de0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
31df0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
31e00 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
31e10 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
31e20 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73  s not the same s
31e30 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ize as the datab
31e40 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20  ase image,.     
31e50 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
31e60 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
31e70 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
31e80 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
31e90 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
31ea0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
31eb0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
31ec0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ze ){.        Pg
31ed0 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72  no nNew = pPager
31ee0 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67  ->dbSize - (pPag
31ef0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45  er->dbSize==PAGE
31f00 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
31f10 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
31f20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
31f30 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
31f40 56 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  VE );.        rc
31f50 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
31f60 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b  e(pPager, nNew);
31f70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
31f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31f90 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31fa0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
31fb0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  .  .      /* Fin
31fc0 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
31fd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
31fe0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
31ff0 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
32000 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
32010 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
32020 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
32030 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
32040 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
32050 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
32060 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
32070 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r)).    }..    p
32080 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
32090 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
320a0 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
320b0 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  ne_exit:.  retur
320c0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
320d0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
320e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
320f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32100 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
32110 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
32120 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
32130 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
32140 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
32150 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
32160 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
32170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
32180 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
32190 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
321a0 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
321b0 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
321c0 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
321d0 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
321e0 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
321f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
32200 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
32210 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
32220 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
32230 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
32240 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
32250 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
32260 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
32270 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
32280 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
32290 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
322a0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
322b0 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
322c0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
322d0 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
322e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
322f0 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
32300 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
32310 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
32320 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
32330 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
32340 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
32350 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
32360 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
32370 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
32380 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
32390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
323a0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
323b0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
323c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
323d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
323e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
323f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
32400 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
32410 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
32420 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
32430 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
32440 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
32450 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
32460 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
32470 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
32480 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
32490 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
324a0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
324b0 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
324c0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
324d0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
324e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
324f0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
32500 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
32510 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
32520 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
32530 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
32540 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
32550 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
32560 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 2a 2a  SERVED state. **
32570 46 49 58 4d 45 2a 2a 3a 20 4d 61 6b 65 20 69 74  FIXME**: Make it
32580 20 73 6f 20 74 68 61 74 20 74 68 69 73 20 74 65   so that this te
32590 73 74 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 66  st always.  ** f
325a0 61 69 6c 73 20 2d 20 6d 61 6b 65 20 69 74 20 73  ails - make it s
325b0 6f 20 74 68 61 74 20 77 65 20 6e 65 76 65 72 20  o that we never 
325c0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
325d0 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 6f   if we do not ho
325e0 6c 64 0a 20 20 2a 2a 20 61 6c 6c 20 6e 65 63 65  ld.  ** all nece
325f0 73 73 61 72 79 20 6c 6f 63 6b 73 2e 0a 20 20 2a  ssary locks..  *
32600 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
32610 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
32620 52 56 45 44 20 29 20 72 65 74 75 72 6e 20 53 51  RVED ) return SQ
32630 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  LITE_ERROR;..  /
32640 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
32650 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
32660 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
32670 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
32680 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
32690 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
326a0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
326b0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
326c0 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
326d0 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
326e0 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
326f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
32700 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
32710 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
32720 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32730 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
32740 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
32750 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
32760 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
32770 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
32780 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
32790 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
327a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
327b0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
327c0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
327d0 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
327e0 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
327f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
32800 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
32810 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
32820 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
32830 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
32840 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
32850 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
32860 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
32870 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
32880 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
32890 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
328a0 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50  odified==0 && pP
328b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
328c0 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65  ode .   && pPage
328d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
328e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
328f0 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20  E_PERSIST.  ){. 
32900 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32910 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
32920 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
32930 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74  ager) );.    ret
32940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
32950 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
32960 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
32970 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
32980 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
32990 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
329a0 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
329b0 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
329c0 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72  bModified );.  r
329d0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
329e0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
329f0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
32a00 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ter);.  return p
32a10 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
32a20 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
32a30 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
32a40 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61 62  anges. The datab
32a50 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
32a60 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
32a70 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ode..**.** This 
32a80 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
32a90 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a  s two tasks:.**.
32aa0 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73  **   1) It rolls
32ab0 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61   back the journa
32ac0 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e  l file, restorin
32ad0 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  g all database f
32ae0 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  ile and .**     
32af0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
32b00 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73 74   pages to the st
32b10 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69 6e  ate they were in
32b20 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
32b30 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61  ction.**      wa
32b40 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a  s opened, and.**
32b50 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a     2) It finaliz
32b60 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
32b70 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20  ile, so that it 
32b80 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20  is not used for 
32b90 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  hot.**      roll
32ba0 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e  back at any poin
32bb0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
32bc0 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74  .**.** subject t
32bd0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
32be0 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a  qualifications:.
32bf0 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a  **.** * If the j
32c00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
32c10 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e  ot yet open when
32c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
32c30 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74  s called,.**   t
32c40 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20  hen only (2) is 
32c50 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68  performed. In th
32c60 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
32c70 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   no journal file
32c80 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61  .**   to roll ba
32c90 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69  ck..**.** * If i
32ca0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
32cb0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
32cc0 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61  TE_FULL, then ta
32cd0 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20  sk (1) is .**   
32ce0 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75  performed. If su
32cf0 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28  ccessful, task (
32d00 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  2). Regardless o
32d10 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a  f the outcome.**
32d20 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68     of either, th
32d30 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
32d40 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
32d50 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
32d60 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69  er.**   (i.e. ei
32d70 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
32d80 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52  R or SQLITE_CORR
32d90 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  UPT)..**.** * If
32da0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
32db0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
32dc0 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
32dd0 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65 72  mpt (1). Whether
32de0 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29  .**   or not (1)
32df0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
32e00 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29  also attempt (2)
32e10 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
32e20 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c   return.**   SQL
32e30 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
32e40 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  e, enter the err
32e50 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
32e60 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a  urn the first .*
32e70 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65  *   error code e
32e80 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a  ncountered. .**.
32e90 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
32ea0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  e there is no ch
32eb0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64 61  ance that the da
32ec0 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74 74  tabase was writt
32ed0 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20  en to. .**   So 
32ee0 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  is safe to final
32ef0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
32f00 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65  file even if the
32f10 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20   playback .**   
32f20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61  (operation 1) fa
32f30 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68  iled. However th
32f40 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74  e pager must ent
32f50 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
32f60 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63  te.**   as the c
32f70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
32f80 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61  n-memory cache a
32f90 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a  re now suspect..
32fa0 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c  **.** * Finally,
32fb0 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43   if in PAGER_EXC
32fc0 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
32fd0 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
32fe0 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70  Only.**   attemp
32ff0 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73 20  t (2) if (1) is 
33000 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75  successful. Retu
33010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
33020 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20  successful,.**  
33030 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65 72   otherwise enter
33040 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
33050 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
33060 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
33070 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e  the .**   failin
33080 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  g operation..**.
33090 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61 73  **   In this cas
330a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
330b0 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ile may have bee
330c0 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f  n written to. So
330d0 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61   if the.**   pla
330e0 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
330f0 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20  did not succeed 
33100 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20  it would not be 
33110 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65  safe to finalize
33120 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  .**   the journa
33130 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73  l file. It needs
33140 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74   to be left in t
33150 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
33160 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65  o that.**   some
33170 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
33180 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65 73  an use it to res
33190 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
331a0 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20  e state (by.**  
331b0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
331c0 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73  lback)..*/.int s
331d0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
331e0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
331f0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
33200 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
33210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33220 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
33230 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c  AGERTRACE(("ROLL
33240 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
33250 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
33260 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
33270 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
33280 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 72 63  int rc2;..    rc
33290 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
332a0 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c  avepoint(pPager,
332b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
332c0 41 43 4b 2c 20 2d 31 29 3b 0a 20 20 20 20 72 63  ACK, -1);.    rc
332d0 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
332e0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
332f0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
33300 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
33310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
33320 20 3d 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d   = rc2;.    rc =
33330 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
33340 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73  ger, rc);.  }els
33350 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64  e if( !pPager->d
33360 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69 73  bModified || !is
33370 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
33380 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
33390 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
333a0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
333b0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
333c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
333d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
333e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
333f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
33400 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
33410 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
33420 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
33430 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
33440 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
33450 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
33460 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
33470 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
33480 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
33490 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
334a0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20    int rc2;.     
334b0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
334c0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
334d0 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67  .      rc2 = pag
334e0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
334f0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
33500 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
33510 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33520 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33530 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
33540 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
33550 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
33560 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
33570 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
33580 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
33590 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
335a0 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  zeValid = 0;.   
335b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
335c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
335d0 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
335e0 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
335f0 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
33600 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
33610 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
33620 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
33630 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
33640 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70   error .    ** p
33650 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a  ersistent..    *
33660 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
33670 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
33680 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
33690 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
336a0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
336b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
336c0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
336d0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
336e0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
336f0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
33700 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
33710 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65 72  .u8 sqlite3Pager
33720 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  Isreadonly(Pager
33730 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
33740 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
33750 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Only;.}../*.** R
33760 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
33770 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
33780 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  o the pager..*/.
33790 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
337a0 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  Refcount(Pager *
337b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
337c0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  n sqlite3PcacheR
337d0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
337e0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
337f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
33800 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65 72  proximate number
33810 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
33820 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ory currently.**
33830 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61 67   used by the pag
33840 65 72 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63  er and its assoc
33850 69 61 74 65 64 20 63 61 63 68 65 2e 0a 2a 2f 0a  iated cache..*/.
33860 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
33870 4d 65 6d 55 73 65 64 28 50 61 67 65 72 20 2a 70  MemUsed(Pager *p
33880 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 70 65  Pager){.  int pe
33890 72 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  rPageSize = pPag
338a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 70  er->pageSize + p
338b0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 2b 20  Pager->nExtra + 
338c0 32 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 65 72  20;.  return per
338d0 50 61 67 65 53 69 7a 65 2a 73 71 6c 69 74 65 33  PageSize*sqlite3
338e0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
338f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
33900 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 71  .           + sq
33910 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28  lite3MallocSize(
33920 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
33930 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
33940 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
33950 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  s to the specifi
33960 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20  ed page..*/.int 
33970 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
33980 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20  Refcount(DbPage 
33990 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
339a0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  n sqlite3PcacheP
339b0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
339c0 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  e);.}..#ifdef SQ
339d0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
339e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
339f0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
33a00 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
33a10 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
33a20 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
33a30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
33a40 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
33a50 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74  ;.  a[0] = sqlit
33a60 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
33a70 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33a80 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69  );.  a[1] = sqli
33a90 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
33aa0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33ab0 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71  he);.  a[2] = sq
33ac0 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43 61  lite3PcacheGetCa
33ad0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
33ae0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d  pPCache);.  a[3]
33af0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33b00 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70  eValid ? (int) p
33b10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20  Pager->dbSize : 
33b20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  -1;.  a[4] = pPa
33b30 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
33b40 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
33b50 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
33b60 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
33b70 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
33b80 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
33b90 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
33ba0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
33bb0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
33bc0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
33bd0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
33be0 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
33bf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
33c00 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
33c10 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
33c20 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  ry pager..*/.int
33c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d   sqlite3PagerIsM
33c40 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67  emdb(Pager *pPag
33c50 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45  er){.  return ME
33c60 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  MDB;.}../*.** Ch
33c70 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 61  eck that there a
33c80 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76  re at least nSav
33c90 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74  epoint savepoint
33ca0 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65  s open. If there
33cb0 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
33cc0 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76  y less than nSav
33cd0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68  epoints open, th
33ce0 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d  en open one or m
33cf0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a  ore savepoints.*
33d00 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65  * to make up the
33d10 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20   difference. If 
33d20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  the number of sa
33d30 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65  vepoints is alre
33d40 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20  ady.** equal to 
33d50 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e  nSavepoint, then
33d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
33d70 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
33d80 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
33d90 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53  ocation fails, S
33da0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
33db0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
33dc0 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
33dd0 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68  while opening th
33de0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
33df0 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65  le, then an IO e
33e00 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20  rror code is.** 
33e10 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
33e20 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
33e30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33e40 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
33e50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
33e60 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b  int nSavepoint){
33e70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33e80 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
33e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33ea0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
33eb0 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20   int nCurrent = 
33ec0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
33ed0 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75  nt;        /* Cu
33ee0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
33ef0 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20  savepoints */.. 
33f00 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e   if( nSavepoint>
33f10 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50 61 67  nCurrent && pPag
33f20 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
33f30 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  {.    int ii;   
33f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33f60 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
33f70 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53  le */.    PagerS
33f80 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20  avepoint *aNew; 
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fa0 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61    /* New Pager.a
33fb0 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20  Savepoint array 
33fc0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
33fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33ff0 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
34000 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
34010 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34020 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
34030 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
34040 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
34050 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77  rc;..    /* Grow
34060 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
34070 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e  point array usin
34080 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74  g realloc(). Ret
34090 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
340a0 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61  .    ** if the a
340b0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e  llocation fails.
340c0 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f   Otherwise, zero
340d0 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e   the new portion
340e0 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20   in case a .    
340f0 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  ** malloc failur
34100 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70  e occurs while p
34110 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20  opulating it in 
34120 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f  the for(...) loo
34130 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a  p below..    */.
34140 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65      aNew = (Page
34150 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c  rSavepoint *)sql
34160 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20  ite3Realloc(.   
34170 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
34180 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28  vepoint, sizeof(
34190 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a  PagerSavepoint)*
341a0 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29  nSavepoint.    )
341b0 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20  ;.    if( !aNew 
341c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
341d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
341e0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26    }.    memset(&
341f0 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20  aNew[nCurrent], 
34200 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e  0, (nSavepoint-n
34210 43 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f  Current) * sizeo
34220 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f(PagerSavepoint
34230 29 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ));.    pPager->
34240 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65  aSavepoint = aNe
34250 77 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  w;..    /* Popul
34260 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76  ate the PagerSav
34270 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
34280 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64  s just allocated
34290 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  . */.    for(ii=
342a0 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61  nCurrent; ii<nSa
342b0 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
342c0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e        aNew[ii].n
342d0 4f 72 69 67 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Orig = nPage;.  
342e0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
342f0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
34300 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
34310 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  f>0 ){.        a
34320 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
34330 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
34340 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lOff;.      }els
34350 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  e{.        aNew[
34360 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f  ii].iOffset = JO
34370 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
34380 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
34390 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75      aNew[ii].iSu
343a0 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  bRec = pPager->n
343b0 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e  SubRec;.      aN
343c0 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
343d0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  int = sqlite3Bit
343e0 76 65 63 43 72 65 61 74 65 28 6e 50 61 67 65 29  vecCreate(nPage)
343f0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e 65  ;.      if( !aNe
34400 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
34410 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  nt ){.        re
34420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
34430 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
34440 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
34450 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
34460 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 53 61      sqlite3WalSa
34470 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2d 3e  vepoint(pPager->
34480 70 57 61 6c 2c 20 61 4e 65 77 5b 69 69 5d 2e 61  pWal, aNew[ii].a
34490 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20  WalData);.      
344a0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
344b0 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 69 2b  nSavepoint = ii+
344c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
344d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
344e0 76 65 70 6f 69 6e 74 3d 3d 6e 53 61 76 65 70 6f  vepoint==nSavepo
344f0 69 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  int );.    asser
34500 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
34510 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  int(pPager);.  }
34520 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
34530 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
34540 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
34550 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
34560 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
34570 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20  a savepoint..** 
34580 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
34590 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
345a0 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65  back need not be
345b0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
345c0 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73  ly .** created s
345d0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
345e0 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20  Parameter op is 
345f0 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41  always either SA
34600 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
34610 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
34620 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20  LEASE..** If it 
34630 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
34640 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61  EASE, then relea
34650 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74  se and destroy t
34660 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74  he savepoint wit
34670 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65  h.** index iSave
34680 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20  point. If it is 
34690 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
346a0 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63  CK, then rollbac
346b0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a  k all changes.**
346c0 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
346d0 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 70  red since the sp
346e0 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
346f0 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
34700 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  *.** The savepoi
34710 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f  nt to rollback o
34720 72 20 72 65 6c 65 61 73 65 20 69 73 20 69 64 65  r release is ide
34730 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
34740 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f  eter .** iSavepo
34750 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  int. A value of 
34760 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61  0 means to opera
34770 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d  te on the outerm
34780 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ost savepoint.**
34790 20 28 74 68 65 20 66 69 72 73 74 20 63 72 65 61   (the first crea
347a0 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66  ted). A value of
347b0 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
347c0 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72  nt-1) means oper
347d0 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f  ate.** on the mo
347e0 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
347f0 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  ted savepoint. I
34800 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f iSavepoint is 
34810 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
34820 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
34830 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20  t-1), then this 
34840 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
34850 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  -op..**.** If a 
34860 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 69  negative value i
34870 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
34880 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
34890 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74  the current.** t
348a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
348b0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
348c0 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20  is different to 
348d0 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
348e0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
348f0 28 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20  () because this 
34900 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
34910 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74  t terminate.** t
34920 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
34930 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  r unlock the dat
34940 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72  abase, it just r
34950 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20  estores the .** 
34960 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
34970 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
34980 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20  original state. 
34990 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61  .**.** In any ca
349a0 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  se, all savepoin
349b0 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ts with an index
349c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53   greater than iS
349d0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65  avepoint .** are
349e0 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74   destroyed. If t
349f0 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
34a00 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d   operation (op==
34a10 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
34a20 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65  E),.** then save
34a30 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  point iSavepoint
34a40 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79   is also destroy
34a50 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
34a60 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
34a70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
34a80 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
34a90 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
34aa0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
34ab0 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72  code if an IO er
34ac0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
34ad0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
34ae0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49  .** savepoint. I
34af0 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75  f no errors occu
34b00 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r, SQLITE_OK is 
34b10 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e  returned..*/ .in
34b20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  t sqlite3PagerSa
34b30 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
34b40 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69  Pager, int op, i
34b50 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
34b60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34b70 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
34b80 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
34b90 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
34ba0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
34bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
34bc0 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f  avepoint>=0 || o
34bd0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
34be0 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  LBACK );..  if( 
34bf0 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65  iSavepoint<pPage
34c00 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  r->nSavepoint ){
34c10 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
34c20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
34c30 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
34c40 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20      int nNew;   
34c50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
34c60 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61   of remaining sa
34c70 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74  vepoints after t
34c80 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20  his op. */..    
34c90 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
34ca0 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  w many savepoint
34cb0 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20  s will still be 
34cc0 61 63 74 69 76 65 20 61 66 74 65 72 20 74 68 69  active after thi
34cd0 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  s.    ** operati
34ce0 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76  on. Store this v
34cf0 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68  alue in nNew. Th
34d00 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63 65  en free resource
34d10 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20  s associated .  
34d20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61    ** with any sa
34d30 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72  vepoints that ar
34d40 65 20 64 65 73 74 72 6f 79 65 64 20 62 79 20 74  e destroyed by t
34d50 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
34d60 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d     */.    nNew =
34d70 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 28   iSavepoint + ((
34d80 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
34d90 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a 20 31  ELEASE ) ? 0 : 1
34da0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
34db0 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
34dc0 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
34dd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
34de0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
34df0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
34e00 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
34e10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
34e20 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
34e30 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
34e40 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
34e50 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ease of the oute
34e60 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c  rmost savepoint,
34e70 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a   truncate .    *
34e80 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
34e90 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  l to zero bytes 
34ea0 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20  in size. */.    
34eb0 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  if( op==SAVEPOIN
34ec0 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20  T_RELEASE ){.   
34ed0 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26     if( nNew==0 &
34ee0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
34ef0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
34f00 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e 63 61    /* Only trunca
34f10 74 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 69  te if it is an i
34f20 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
34f30 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rnal. */.       
34f40 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
34f50 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
34f60 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
34f70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34f80 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
34f90 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20  r->sjfd, 0);.   
34fa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
34fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
34fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34fd0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
34fe0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 0;.      }. 
34ff0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c 73 65     }.    /* Else
35000 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
35010 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70  ack operation, p
35020 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65 63  layback the spec
35030 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  ified savepoint.
35040 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
35050 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20  is a temp-file, 
35060 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
35070 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
35080 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20  file has.    ** 
35090 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
350a0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
350b0 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  e there have bee
350c0 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a  n no changes to.
350d0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
350e0 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65  ase file, so the
350f0 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
35100 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70  ion can be skipp
35110 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  ed..    */.    e
35120 6c 73 65 20 69 66 28 20 70 61 67 65 72 55 73 65  lse if( pagerUse
35130 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 69  Wal(pPager) || i
35140 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35150 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
35160 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
35170 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
35180 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
35190 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
351a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
351b0 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
351c0 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
351d0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
351e0 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
351f0 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
35200 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
35210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
35220 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
35230 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
35240 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
35250 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
35260 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
35270 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35280 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
35290 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
352a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
352b0 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
352c0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
352d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
352e0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
352f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35300 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
35310 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
35320 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
35330 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
35340 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
35350 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
35360 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
35370 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
35380 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
35390 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
353a0 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
353b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
353c0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
353d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
353e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
353f0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
35400 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
35410 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
35420 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
35430 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
35440 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
35450 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35460 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
35470 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
35480 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
35490 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
354a0 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
354b0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
354c0 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
354d0 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
354e0 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
354f0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
35500 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
35510 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
35520 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
35530 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
35540 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
35550 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65  ./*.** Set or re
35560 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65 63  trieve the codec
35570 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
35580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
35590 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
355a0 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
355b0 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
355c0 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
355d0 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
355e0 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
355f0 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
35600 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28  t,int),.  void (
35610 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
35620 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  d*),.  void *pCo
35630 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61  dec.){.  if( pPa
35640 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
35650 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
35660 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
35670 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dec);.  pPager->
35680 78 43 6f 64 65 63 20 3d 20 70 50 61 67 65 72 2d  xCodec = pPager-
35690 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f  >memDb ? 0 : xCo
356a0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  dec;.  pPager->x
356b0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20  CodecSizeChng = 
356c0 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a  xCodecSizeChng;.
356d0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
356e0 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65  Free = xCodecFre
356f0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  e;.  pPager->pCo
35700 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20  dec = pCodec;.  
35710 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
35720 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69  pPager);.}.stati
35730 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  c void *sqlite3P
35740 61 67 65 72 47 65 74 43 6f 64 65 63 28 50 61 67  agerGetCodec(Pag
35750 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
35760 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43  eturn pPager->pC
35770 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  odec;.}.#endif..
35780 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35790 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
357a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
357b0 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
357c0 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
357d0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
357e0 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
357f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
35800 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
35810 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
35820 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
35830 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
35840 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
35850 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
35860 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
35870 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
35880 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
35890 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
358a0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
358b0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
358c0 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
358d0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
358e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
358f0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
35900 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
35910 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
35920 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
35930 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
35940 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
35950 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
35960 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
35970 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
35980 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
35990 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
359a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
359b0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
359c0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
359d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
359e0 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
359f0 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
35a00 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
35a10 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
35a20 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
35a30 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
35a40 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
35a50 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
35a60 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
35a70 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
35a80 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
35a90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
35aa0 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a  s active)..**.**
35ab0 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61   If the fourth a
35ac0 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69  rgument, isCommi
35ad0 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, is non-zero, 
35ae0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
35af0 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64  s being.** moved
35b00 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61   as part of a da
35b10 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a  tabase reorganiz
35b20 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72  ation just befor
35b30 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
35b40 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  n .** is being c
35b50 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69  ommitted. In thi
35b60 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75  s case, it is gu
35b70 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
35b80 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
35b90 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74  .** pPg refers t
35ba0 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  o will not be wr
35bb0 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77  itten to again w
35bc0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
35bd0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
35be0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
35bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
35c00 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
35c10 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
35c20 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f  ror.** occurs. O
35c30 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65 74  therwise, it ret
35c40 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
35c50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
35c60 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
35c70 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
35c80 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
35c90 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29  o, int isCommit)
35ca0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
35cb0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
35cc0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
35cd0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
35ce0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  */.  Pgno needSy
35cf0 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20  ncPgno = 0;     
35d00 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f    /* Old value o
35d10 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20  f pPg->pgno, if 
35d20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
35d30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
35d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
35d60 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67  e */.  Pgno orig
35d70 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
35d80 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69      /* The origi
35d90 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
35da0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
35db0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
35dc0 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 62  /* In order to b
35dd0 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
35de0 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ck, an in-memory
35df0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 6a   database must j
35e00 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20  ournal.  ** the 
35e10 70 61 67 65 20 77 65 20 61 72 65 20 6d 6f 76 69  page we are movi
35e20 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20  ng from..  */.  
35e30 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
35e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35e50 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
35e60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
35e70 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
35e80 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  If the page bein
35e90 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79  g moved is dirty
35ea0 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65   and has not bee
35eb0 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c  n saved by the l
35ec0 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70  atest.  ** savep
35ed0 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20  oint, then save 
35ee0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
35ef0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
35f00 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20   into the .  ** 
35f10 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e  sub-journal now.
35f20 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
35f30 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
35f40 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
35f50 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  io:.  **.  **   
35f60 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20  BEGIN;.  **     
35f70 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c  <journal page X,
35f80 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20   then modify it 
35f90 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20  in memory>.  ** 
35fa0 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e      SAVEPOINT on
35fb0 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d  e;.  **       <M
35fc0 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f  ove page X to lo
35fd0 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20  cation Y>.  **  
35fe0 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f     ROLLBACK TO o
35ff0 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ne;.  **.  ** If
36000 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74   page X were not
36010 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
36020 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65  sub-journal here
36030 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20  , it would not. 
36040 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20   ** be possible 
36050 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63  to restore its c
36060 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65  ontents when the
36070 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e   "ROLLBACK TO on
36080 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  e".  ** statemen
36090 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73  t were is proces
360a0 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73  sed..  **.  ** s
360b0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20  ubjournalPage() 
360c0 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f  may need to allo
360d0 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74  cate space to st
360e0 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
360f0 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d  to.  ** one or m
36100 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69  ore savepoint bi
36110 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74  tvecs. This is t
36120 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66  he reason this f
36130 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79  unction.  ** may
36140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36150 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  OMEM..  */.  if(
36160 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
36170 52 5f 44 49 52 54 59 0a 20 20 20 26 26 20 73 75  R_DIRTY.   && su
36180 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
36190 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  Pg).   && SQLITE
361a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f  _OK!=(rc = subjo
361b0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a  urnalPage(pPg)).
361c0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
361d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
361e0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20  TRACE(("MOVE %d 
361f0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
36200 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
36210 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
36220 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
36230 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
36240 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
36250 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
36260 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
36270 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
36280 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
36290 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a  no, pgno))..  /*
362a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
362b0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
362c0 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
362d0 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
362e0 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
362f0 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
36300 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
36310 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
36320 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
36330 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
36340 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
36350 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
36360 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
36370 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
36380 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
36390 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
363a0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
363b0 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
363c0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
363d0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
363e0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
363f0 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
36400 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
36410 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
36420 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
36430 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
36440 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
36450 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
36460 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
36470 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
36480 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
36490 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
364a0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
364b0 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20  DR_DIRTY );.    
364c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
364d0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
364e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
364f0 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
36500 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
36510 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
36520 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
36530 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
36540 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
36550 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
36560 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
36570 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
36580 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
36590 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
365a0 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
365b0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
365c0 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
365d0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
365e0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  ~PGHDR_NEED_SYNC
365f0 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
36600 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
36610 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
36620 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
36630 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
36640 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
36650 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
36660 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67  |= (pPgOld->flag
36670 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
36680 43 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  C);.    if( MEMD
36690 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f  B ){.      /* Do
366a0 20 6e 6f 74 20 64 69 73 63 61 72 64 20 70 61 67   not discard pag
366b0 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65  es from an in-me
366c0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 69  mory database si
366d0 6e 63 65 20 77 65 20 6d 69 67 68 74 0a 20 20 20  nce we might.   
366e0 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f     ** need to ro
366f0 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a  llback later.  J
36700 75 73 74 20 6d 6f 76 65 20 74 68 65 20 70 61 67  ust move the pag
36710 65 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  e out of the way
36720 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
36730 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
36740 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  eValid );.      
36750 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
36760 65 28 70 50 67 4f 6c 64 2c 20 70 50 61 67 65 72  e(pPgOld, pPager
36770 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20  ->dbSize+1);.   
36780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
36790 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
367a0 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  pPgOld);.    }. 
367b0 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d   }..  origPgno =
367c0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71   pPg->pgno;.  sq
367d0 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
367e0 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71  pPg, pgno);.  sq
367f0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
36800 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
36810 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
36820 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
36830 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
36840 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
36850 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
36860 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
36870 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
36880 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
36890 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
368a0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
368b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
368c0 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
368d0 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
368e0 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
368f0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
36900 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
36910 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f  e .    ** "is jo
36920 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20  urnaled" bitvec 
36930 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65  flag has been se
36940 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
36950 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a   be remedied by.
36960 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74      ** loading t
36970 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
36980 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
36990 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
369a0 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  dr.needSync .   
369b0 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a   ** flag..    **
369c0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
369d0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
369e0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
369f0 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
36a00 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
36a10 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
36a20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
36a30 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
36a40 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e pInJournal[]. 
36a50 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
36a60 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
36a70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
36a80 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
36a90 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
36aa0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
36ab0 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
36ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36ad0 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
36ae0 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
36af0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
36b00 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
36b10 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
36b20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
36b30 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
36b40 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
36b50 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
36b60 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
36b70 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
36b80 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
36b90 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
36ba0 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
36bb0 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
36bc0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
36bd0 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
36be0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
36bf0 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
36c00 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
36c10 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
36c20 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
36c30 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
36c40 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
36c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36c60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
36c70 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50  needSyncPgno<=pP
36c80 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
36c90 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
36ca0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  rt( pPager->pTmp
36cb0 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20 20 20  Space!=0 );.    
36cc0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
36cd0 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  cClear(pPager->p
36ce0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53  InJournal, needS
36cf0 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d  yncPgno, pPager-
36d00 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
36d10 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
36d20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
36d30 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
36d40 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74   = 1;.    assert
36d50 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
36d60 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  ==0 && !MEMDB );
36d70 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
36d80 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
36d90 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74  _SYNC;.    sqlit
36da0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
36db0 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
36dc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36dd0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
36de0 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20   /*.  ** For an 
36df0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
36e00 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  se, make sure th
36e10 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
36e20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74  continues.  ** t
36e30 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65  o exist, in case
36e40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
36e50 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62   needs to roll b
36e60 61 63 6b 2e 20 20 55 73 65 20 70 50 67 4f 6c 64  ack.  Use pPgOld
36e70 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 6f 72 69  .  ** as the ori
36e80 67 69 6e 61 6c 20 70 61 67 65 20 73 69 6e 63 65  ginal page since
36e90 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79 20   it has already 
36ea0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  been allocated..
36eb0 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
36ec0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
36ed0 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64  cacheMove(pPgOld
36ee0 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20  , origPgno);.   
36ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
36f00 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  ef(pPgOld);.  }.
36f10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
36f20 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
36f30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
36f40 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
36f50 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
36f60 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
36f70 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
36f80 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
36f90 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
36fa0 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50  Pg->nRef>0 || pP
36fb0 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
36fc0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67   );.  return pPg
36fd0 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pData;.}../*.*
36fe0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
36ff0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
37000 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
37010 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
37020 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
37030 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
37040 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
37050 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
37060 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
37070 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
37080 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a  pPg->pExtra;.}..
37090 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
370a0 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
370b0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
370c0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
370d0 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
370e0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
370f0 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
37100 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
37110 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
37120 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
37130 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
37140 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
37150 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
37160 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
37170 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
37180 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
37190 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
371a0 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
371b0 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
371c0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
371d0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
371e0 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
371f0 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
37200 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
37210 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
37220 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
37230 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
37240 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
37250 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
37260 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
37270 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
37280 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
37290 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
372a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
372b0 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
372c0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
372d0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
372e0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
372f0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
37300 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
37310 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
37320 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
37330 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
37340 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
37350 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
37360 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
37370 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
37380 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
37390 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
373a0 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a  de = (u8)eMode;.
373b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
373c0 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
373d0 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  iveMode;.}../*.*
373e0 2a 20 53 65 74 20 74 68 65 20 6a 6f 75 72 6e 61  * Set the journa
373f0 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  l-mode for this 
37400 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
37410 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
37420 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ne of:.**.**    
37430 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37440 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50  E_DELETE.**    P
37450 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37460 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  _TRUNCATE.**    
37470 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37480 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  E_PERSIST.**    
37490 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
374a0 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45  E_OFF.**    PAGE
374b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
374c0 4d 4f 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52  MORY.**    PAGER
374d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
374e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
374f0 61 6c 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  almode is set to
37500 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
37510 66 69 65 64 20 69 66 20 74 68 65 20 63 68 61 6e  fied if the chan
37520 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 0a 2a  ge is allowed..*
37530 2a 20 54 68 65 20 63 68 61 6e 67 65 20 6d 61 79  * The change may
37540 20 62 65 20 64 69 73 61 6c 6c 6f 77 65 64 20 66   be disallowed f
37550 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  or the following
37560 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20   reasons:.**.** 
37570 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72    *  An in-memor
37580 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 6f  y database can o
37590 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f 75  nly have its jou
375a0 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74 6f  rnal_mode set to
375b0 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f 72   _OFF.**      or
375c0 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20   _MEMORY..**.** 
375d0 20 20 2a 20 20 54 65 6d 70 6f 72 61 72 79 20 64    *  Temporary d
375e0 61 74 61 62 61 73 65 73 20 63 61 6e 6e 6f 74 20  atabases cannot 
375f0 68 61 76 65 20 5f 57 41 4c 20 6a 6f 75 72 6e 61  have _WAL journa
37600 6c 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lmode..**.** The
37610 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61   returned indica
37620 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  te the current (
37630 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
37640 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a  ) journal-mode..
37650 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37660 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerSetJournalMod
37670 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
37680 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 75   int eMode){.  u
37690 38 20 65 4f 6c 64 20 3d 20 70 50 61 67 65 72 2d  8 eOld = pPager-
376a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20  >journalMode;   
376b0 20 2f 2a 20 50 72 69 6f 72 20 6a 6f 75 72 6e 61   /* Prior journa
376c0 6c 6d 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  lmode */..  /* T
376d0 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
376e0 65 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  er is always val
376f0 69 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  id */.  assert( 
37700 20 20 20 20 20 65 4d 6f 64 65 3d 3d 50 41 47 45       eMode==PAGE
37710 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
37720 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  LETE.           
37730 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
37740 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
37750 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20  NCATE.          
37760 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
37770 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
37780 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20  RSIST.          
37790 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
377a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
377b0 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  F .            |
377c0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
377d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
377e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
377f0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
37800 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
37810 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  ;..  /* Do not a
37820 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c  llow the journal
37830 6d 6f 64 65 20 6f 66 20 61 20 54 45 4d 50 20 64  mode of a TEMP d
37840 61 74 61 62 61 73 65 20 74 6f 20 62 65 20 63 68  atabase to be ch
37850 61 6e 67 65 64 20 74 6f 20 57 41 4c 0a 20 20 2a  anged to WAL.  *
37860 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
37870 74 65 6d 70 46 69 6c 65 20 26 26 20 65 4d 6f 64  tempFile && eMod
37880 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37890 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
378a0 61 73 73 65 72 74 28 20 65 4f 6c 64 21 3d 50 41  assert( eOld!=PA
378b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
378c0 57 41 4c 20 29 3b 0a 20 20 20 20 65 4d 6f 64 65  WAL );.    eMode
378d0 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20 20   = eOld;.  }..  
378e0 2f 2a 20 44 6f 20 61 6c 6c 6f 77 20 74 68 65 20  /* Do allow the 
378f0 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61  journalmode of a
37900 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
37910 62 61 73 65 20 74 6f 20 62 65 20 73 65 74 20 74  base to be set t
37920 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20  o.  ** anything 
37930 6f 74 68 65 72 20 74 68 61 6e 20 4d 45 4d 4f 52  other than MEMOR
37940 59 20 6f 72 20 4f 46 46 0a 20 20 2a 2f 0a 20 20  Y or OFF.  */.  
37950 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
37960 20 61 73 73 65 72 74 28 20 65 4f 6c 64 3d 3d 50   assert( eOld==P
37970 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37980 5f 4d 45 4d 4f 52 59 20 7c 7c 20 65 4f 6c 64 3d  _MEMORY || eOld=
37990 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
379a0 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
379b0 28 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  ( eMode!=PAGER_J
379c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
379d0 59 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47 45  Y && eMode!=PAGE
379e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
379f0 46 20 29 7b 0a 20 20 20 20 20 20 65 4d 6f 64 65  F ){.      eMode
37a00 20 3d 20 65 4f 6c 64 3b 0a 20 20 20 20 7d 0a 20   = eOld;.    }. 
37a10 20 7d 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65 21   }..  if( eMode!
37a20 3d 65 4f 6c 64 20 29 7b 0a 20 20 20 20 2f 2a 20  =eOld ){.    /* 
37a30 57 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 62 65  When changing be
37a40 74 77 65 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d  tween rollback m
37a50 6f 64 65 73 2c 20 63 6c 6f 73 65 20 74 68 65 20  odes, close the 
37a60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 72 69  journal file pri
37a70 6f 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  or.    ** to the
37a80 20 63 68 61 6e 67 65 2e 20 20 42 75 74 20 77 68   change.  But wh
37a90 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f 6d  en changing from
37aa0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65   a rollback mode
37ab0 20 74 6f 20 57 41 4c 2c 20 6b 65 65 70 0a 20 20   to WAL, keep.  
37ac0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
37ad0 20 6f 70 65 6e 20 73 69 6e 63 65 20 74 68 65 72   open since ther
37ae0 65 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 2d  e is a rollback-
37af0 73 74 79 6c 65 20 74 72 61 6e 73 61 63 74 69 6f  style transactio
37b00 6e 20 69 6e 20 70 6c 61 79 0a 20 20 20 20 2a 2a  n in play.    **
37b10 20 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   used to convert
37b20 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
37b30 62 65 72 73 20 69 6e 20 74 68 65 20 62 74 72 65  bers in the btre
37b40 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
37b50 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
37b60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
37b70 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  eMode!=PAGER_JOU
37b80 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a  RNALMODE_WAL ){.
37b90 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
37ba0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
37bb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
37bc0 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75 72   Change the jour
37bd0 6e 61 6c 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20 20  nal mode. */.   
37be0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37bf0 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
37c00 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
37c10 72 61 6e 73 69 73 74 69 6f 6e 69 6e 67 20 66 72  ransistioning fr
37c20 6f 6d 20 54 52 55 4e 43 41 54 45 20 6f 72 20 50  om TRUNCATE or P
37c30 45 52 53 49 53 54 20 74 6f 20 61 6e 79 20 6f 74  ERSIST to any ot
37c40 68 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  her journal.    
37c50 2a 2a 20 6d 6f 64 65 20 65 78 63 65 70 74 20 57  ** mode except W
37c60 41 4c 20 28 61 6e 64 20 77 65 20 61 72 65 20 6e  AL (and we are n
37c70 6f 74 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ot in locking_mo
37c80 64 65 3d 45 58 43 4c 55 53 49 56 45 29 20 74 68  de=EXCLUSIVE) th
37c90 65 6e 20 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  en .    ** delet
37ca0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
37cb0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
37cc0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37cd0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
37ce0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
37cf0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
37d00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
37d10 53 49 53 54 20 26 20 35 29 3d 3d 31 20 29 3b 0a  SIST & 5)==1 );.
37d20 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
37d30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
37d40 45 4c 45 54 45 20 26 20 35 29 3d 3d 30 20 29 3b  ELETE & 5)==0 );
37d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
37d60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37d70 4d 45 4d 4f 52 59 20 26 20 35 29 3d 3d 34 20 29  MEMORY & 5)==4 )
37d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
37d90 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37da0 5f 4f 46 46 20 26 20 35 29 3d 3d 30 20 29 3b 0a  _OFF & 5)==0 );.
37db0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
37dc0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
37dd0 41 4c 20 26 20 35 29 3d 3d 35 20 29 3b 0a 0a 20  AL & 5)==5 );.. 
37de0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
37df0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
37e00 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
37e10 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 69 66  veMode );.    if
37e20 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
37e30 73 69 76 65 4d 6f 64 65 20 26 26 20 28 65 4f 6c  siveMode && (eOl
37e40 64 20 26 20 35 29 3d 3d 31 20 26 26 20 28 65 4d  d & 5)==1 && (eM
37e50 6f 64 65 20 26 20 31 29 3d 3d 30 20 29 7b 0a 0a  ode & 1)==0 ){..
37e60 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
37e70 20 63 61 73 65 20 77 65 20 77 6f 75 6c 64 20 6c   case we would l
37e80 69 6b 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ike to delete th
37e90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
37ea0 49 66 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  If it is.      *
37eb0 2a 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20  * not possible, 
37ec0 74 68 65 6e 20 74 68 61 74 20 69 73 20 6e 6f 74  then that is not
37ed0 20 61 20 70 72 6f 62 6c 65 6d 2e 20 44 65 6c 65   a problem. Dele
37ee0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
37ef0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 68   file.      ** h
37f00 65 72 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ere is an optimi
37f10 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 20 20 20  zation only..   
37f20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
37f30 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67 20 74  efore deleting t
37f40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
37f50 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
37f60 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
37f70 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
37f80 20 66 69 6c 65 2e 20 54 68 69 73 20 65 6e 73 75   file. This ensu
37f90 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
37fa0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
37fb0 20 64 65 6c 65 74 65 64 0a 20 20 20 20 20 20 2a   deleted.      *
37fc0 2a 20 77 68 69 6c 65 20 69 74 20 69 73 20 69 6e  * while it is in
37fd0 20 75 73 65 20 62 79 20 73 6f 6d 65 20 6f 74 68   use by some oth
37fe0 65 72 20 63 6c 69 65 6e 74 2e 0a 20 20 20 20 20  er client..     
37ff0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 63   */.      int rc
38000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
38010 20 20 20 20 69 6e 74 20 73 74 61 74 65 20 3d 20      int state = 
38020 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
38030 20 20 20 20 20 69 66 28 20 73 74 61 74 65 3c 50       if( state<P
38040 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
38050 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
38060 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
38070 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
38080 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
38090 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
380a0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
380b0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
380c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
380d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
380e0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
380f0 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
38100 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
38110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38130 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
38140 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
38150 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
38160 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
38170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
38180 5f 4f 4b 20 26 26 20 73 74 61 74 65 3d 3d 50 41  _OK && state==PA
38190 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
381a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
381b0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
381c0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
381d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
381e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
381f0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  OCK ){.        p
38200 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
38210 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
38220 20 20 20 61 73 73 65 72 74 28 20 73 74 61 74 65     assert( state
38230 3d 3d 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ==pPager->state 
38240 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
38250 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  /* Return the ne
38260 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a  w journal mode *
38270 2f 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  /.  return (int)
38280 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
38290 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ode;.}../*.** Re
382a0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
382b0 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a 2a   journal mode..*
382c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
382d0 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65  erGetJournalMode
382e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
382f0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
38300 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
38310 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  de;.}../*.** Ret
38320 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
38330 70 61 67 65 72 20 69 73 20 69 6e 20 61 20 73 74  pager is in a st
38340 61 74 65 20 77 68 65 72 65 20 69 74 20 69 73 20  ate where it is 
38350 4f 4b 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  OK to change the
38360 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e  .** journalmode.
38370 20 20 4a 6f 75 72 6e 61 6c 6d 6f 64 65 20 63 68    Journalmode ch
38380 61 6e 67 65 73 20 63 61 6e 20 6f 6e 6c 79 20 68  anges can only h
38390 61 70 70 65 6e 20 77 68 65 6e 20 74 68 65 20 64  appen when the d
383a0 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 75 6e  atabase.** is un
383b0 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  modified..*/.int
383c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 6b 54   sqlite3PagerOkT
383d0 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d 6f  oChangeJournalMo
383e0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
383f0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
38400 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 20 72 65  >dbModified ) re
38410 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69 73  turn 0;.  if( is
38420 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
38430 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
38440 72 6e 61 6c 4f 66 66 3e 30 20 29 20 72 65 74 75  rnalOff>0 ) retu
38450 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
38460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
38470 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
38480 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
38490 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
384a0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69  les..**.** Setti
384b0 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69  ng the size limi
384c0 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f  t to -1 means no
384d0 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63   limit is enforc
384e0 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70  ed..** An attemp
384f0 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74  t to set a limit
38500 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31   smaller than -1
38510 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
38520 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72  i64 sqlite3Pager
38530 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
38540 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
38550 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69  i64 iLimit){.  i
38560 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b  f( iLimit>=-1 ){
38570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
38580 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
38590 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  iLimit;.  }.  re
385a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  turn pPager->jou
385b0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d  rnalSizeLimit;.}
385c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
385d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
385e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
385f0 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61  variable. The ba
38600 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  ckup module.** i
38610 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74  n backup.c maint
38620 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ains the content
38630 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62 6c   of this variabl
38640 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  e. This module.*
38650 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75 65  * uses it opaque
38660 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ly as an argumen
38670 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b  t to sqlite3Back
38680 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a  upRestart() and.
38690 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  ** sqlite3Backup
386a0 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a  Update() only..*
386b0 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  /.sqlite3_backup
386c0 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42   **sqlite3PagerB
386d0 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a  ackupPtr(Pager *
386e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
386f0 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  n &pPager->pBack
38700 75 70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  up;.}..#ifndef S
38710 51 4c 49 54 45