/ Hex Artifact Content
Login

Artifact 35c7e3b5bbad76f04e7143d2d4676a269a8ba9fc:


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 6c 6f 67 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "log.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: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  };../*.** A open
2660: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2670: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2680: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
2690: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  cture..**.** err
26a0: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  Code.**.**   Pag
26b0: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
26c0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
26d0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
26e0: 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20 6f  RRUPT, or.**   o
26f0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f  r SQLITE_FULL. O
2700: 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66  nce one of the f
2710: 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72  irst three error
2720: 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72  s occurs, it per
2730: 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20 69  sists.**   and i
2740: 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68  s returned as th
2750: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72  e result of ever
2760: 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50  y major pager AP
2770: 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20  I call.  The.** 
2780: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65    SQLITE_FULL re
2790: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
27a0: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
27b0: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
27c0: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 20  y until the.**  
27d0: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
27e0: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
27f0: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
2800: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
2810: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  .**   SQLITE_FUL
2820: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
2830: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
2840: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
2850: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
2860: 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65 79  .**   APIs, they
2870: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2880: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2890: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61 6c  .**.** dbSizeVal
28a0: 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  id, dbSize, dbOr
28b0: 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69  igSize, dbFileSi
28c0: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61 67  ze.**.**   Manag
28d0: 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ing the size of 
28e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28f0: 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61 20  e in pages is a 
2900: 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61 74  little complicat
2910: 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61 72  ed..**   The var
2920: 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53 69  iable Pager.dbSi
2930: 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ze contains the 
2940: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2950: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2960: 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75 72  e.**   image cur
2970: 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e  rently contains.
2980: 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73 65   As the database
2990: 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20   image grows or 
29a0: 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20  shrinks this.** 
29b0: 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 70    variable is up
29c0: 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69 61  dated. The varia
29d0: 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ble Pager.dbFile
29e0: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
29f0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f 66  e number.**   of
2a00: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
2a10: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
2a20: 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  s may be differe
2a30: 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64 62  nt from Pager.db
2a40: 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f 6d  Size.**   if som
2a50: 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  e pages have bee
2a60: 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
2a70: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2a80: 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69   but not yet wri
2a90: 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66 72  tten.**   out fr
2aa0: 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  om the cache to 
2ab0: 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  the actual file 
2ac0: 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74  on disk. Or if t
2ad0: 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65  he image has bee
2ae0: 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65 64  n.**   truncated
2af0: 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   by an increment
2b00: 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  al-vacuum operat
2b10: 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e 64  ion. The Pager.d
2b20: 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61 62  bOrigSize variab
2b30: 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e 73  le.**   contains
2b40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2b50: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
2b60: 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e 20  base image when 
2b70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
2b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
2b90: 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f 6e   opened. The con
2ba0: 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68 72  tents of all thr
2bb0: 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72 69  ee of these vari
2bc0: 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f 6e  ables is.**   on
2bd0: 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ly guaranteed to
2be0: 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20 74   be correct if t
2bf0: 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72  he boolean Pager
2c00: 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20  .dbSizeValid is 
2c10: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  true..**.**   TO
2c20: 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20 63  DO: Under what c
2c30: 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62 53  onditions is dbS
2c40: 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43 6c  izeValid set? Cl
2c50: 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68 61  eared?.**.** cha
2c60: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a  ngeCountDone.**.
2c70: 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61  **   This boolea
2c80: 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  n variable is us
2c90: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
2ca0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d  that the change-
2cb0: 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74  counter .**   (t
2cc0: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
2cd0: 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f   field at byte o
2ce0: 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20  ffset 24 of the 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69  database file) i
2d00: 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61  s .**   not upda
2d10: 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74  ted more often t
2d20: 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a  han necessary. .
2d30: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65  **.**   It is se
2d40: 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74  t to true when t
2d50: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2d60: 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  r field is updat
2d70: 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20  ed, which .**   
2d80: 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2d90: 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  if an exclusive 
2da0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
2db0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2dc0: 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c  e..**   It is cl
2dd0: 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61  eared (set to fa
2de0: 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e  lse) whenever an
2df0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2e00: 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75  is .**   relinqu
2e10: 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ished on the dat
2e20: 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68  abase file. Each
2e30: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
2e40: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
2e50: 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67  ,.**   The chang
2e60: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
2e70: 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66  is inspected. If
2e80: 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65   it is true, the
2e90: 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70   work of.**   up
2ea0: 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67  dating the chang
2eb0: 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69  e-counter is omi
2ec0: 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72  tted for the cur
2ed0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2ee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d  ..**.**   This m
2ef0: 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74  echanism means t
2f00: 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  hat when running
2f10: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
2f20: 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  de, a connection
2f30: 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79   .**   need only
2f40: 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2f50: 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c  ge-counter once,
2f60: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
2f70: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2f80: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2f90: 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a 2a   dbModified.**.*
2fa0: 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66 69  *   The dbModifi
2fb0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  ed flag is set w
2fc0: 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62 61  henever a databa
2fd0: 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74 69  se page is dirti
2fe0: 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  ed..**   It is c
2ff0: 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65 6e  leared at the en
3000: 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73 61  d of each transa
3010: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49  ction..**.**   I
3020: 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 63  t is used when c
3030: 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74 68  ommitting or oth
3040: 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61 20  erwise ending a 
3050: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 0a  transaction. If.
3060: 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69 66  **   the dbModif
3070: 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ied flag is clea
3080: 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72 6b  r then less work
3090: 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 2e   has to be done.
30a0: 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53 74  .**.** journalSt
30b0: 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  arted.**.**   Th
30c0: 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20 77  is flag is set w
30d0: 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65 20  henever the the 
30e0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
30f0: 6f 70 65 6e 65 64 20 61 6e 64 0a 2a 2a 20 20 20  opened and.**   
3100: 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 0a 2a  initialized.**.*
3110: 2a 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66  *   The point of
3120: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68   this flag is th
3130: 61 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65  at it must be se
3140: 74 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20  t after the .** 
3150: 20 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20    first journal 
3160: 68 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72  header in a jour
3170: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
3180: 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  n synced to disk
3190: 2e 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69  ..**   After thi
31a0: 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
31b0: 6e 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64  new pages append
31c0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
31d0: 73 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20  se .**   do not 
31e0: 6e 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e  need the PGHDR_N
31f0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65  EED_SYNC flag se
3200: 74 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f  t, as they do no
3210: 74 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77  t need.**   to w
3220: 61 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61  ait for a journa
3230: 6c 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68  l sync before th
3240: 65 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ey can be writte
3250: 6e 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68  n out to.**   th
3260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3270: 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61  (see function pa
3280: 67 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a  ger_write())..**
3290: 20 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72     .** setMaster
32a0: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  .**.**   This va
32b0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
32c0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
32d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
32e0: 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20   file name.**   
32f0: 28 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79  (if any) is only
3300: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
3310: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
3320: 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  nce..**.**   Whe
3330: 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
3340: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
3350: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
3360: 69 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79  ile name (if any
3370: 29 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72  ).**   may be wr
3380: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
3390: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c  ournal file whil
33a0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  e the pager is s
33b0: 74 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47  till in.**   PAG
33c0: 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
33d0: 65 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61  e (see CommitPha
33e0: 73 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20  seOne() for the 
33f0: 61 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20  action). It.**  
3400: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74   then attempts t
3410: 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20  o upgrade to an 
3420: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
3430: 49 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a  If this attempt.
3440: 2a 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e  **   fails, then
3450: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79   SQLITE_BUSY may
3460: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
3470: 74 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65  the user and the
3480: 20 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61   user.**   may a
3490: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74  ttempt to commit
34a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34b0: 20 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61   again later (ca
34c0: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69  lling.**   Commi
34d0: 74 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69  tPhaseOne() agai
34e0: 6e 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73  n). This flag is
34f0: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3500: 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d  that the .**   m
3510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
3520: 6d 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74  me is only writt
3530: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3540: 6c 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74  l file the first
3550: 0a 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69  .**   time Commi
3560: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
3570: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e  alled..**.** doN
3580: 6f 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 57  otSync.**.**   W
3590: 68 65 6e 20 65 6e 61 62 6c 65 64 2c 20 63 61 63  hen enabled, cac
35a0: 68 65 20 73 70 69 6c 6c 73 20 61 72 65 20 70 72  he spills are pr
35b0: 6f 68 69 62 69 74 65 64 20 61 6e 64 20 74 68 65  ohibited and the
35c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
35d0: 6e 6e 6f 74 0a 2a 2a 20 20 20 62 65 20 73 79 6e  nnot.**   be syn
35e0: 63 65 64 2e 20 20 54 68 69 73 20 76 61 72 69 61  ced.  This varia
35f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
3600: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
3610: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 0a 2a  3PagerWrite() .*
3620: 2a 20 20 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  *   in order to 
3630: 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61  prevent a journa
3640: 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70  l sync from happ
3650: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
3660: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
3670: 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67  lling of two pag
3680: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
3690: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65  ector..**.** nee
36a0: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  dSync.**.**   TO
36b0: 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20  DO: It might be 
36c0: 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68  easier to set th
36d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77  is variable in w
36e0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
36f0: 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d  .**   and writeM
3700: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f  asterJournal() o
3710: 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20  nly. Change its 
3720: 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79  meaning to "unsy
3730: 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68  nced data.**   h
3740: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
3750: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e  to the journal".
3760: 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d  .**.** subjInMem
3770: 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ory.**.**   This
3780: 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   is a boolean va
3790: 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c  riable. If true,
37a0: 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
37b0: 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  ed sub-journal.*
37c0: 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73  *   is opened as
37d0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
37e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66  urnal file. If f
37f0: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65  alse, then in-me
3800: 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f  mory.**   sub-jo
3810: 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20  urnals are only 
3820: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
3830: 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a  ry pager files..
3840: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
3850: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
3860: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
3870: 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20  /* OS functions 
3880: 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f  to use for IO */
3890: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
38a0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
38b0: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
38c0: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
38d0: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
38e0: 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20  u8 journalMode; 
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3900: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  n of the PAGER_J
3910: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
3920: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
3930: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3940: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
3950: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
3960: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
3970: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
39a0: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
39b0: 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  s */.  u8 noSync
39c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
39d0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
39e0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
39f0: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
3a00: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
3a10: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
3a20: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
3a30: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
3a40: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
3a50: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
3a60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3a70: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
3a80: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
3a90: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
3ab0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
3ac0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
3ad0: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3af0: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
3b00: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
3b10: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
3b40: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
3b50: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
3b60: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
3b70: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
3b80: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61  s members that a
3b90: 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  re dynamically. 
3ba0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72   ** modified dur
3bb0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  ing normal opera
3bc0: 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72  tions. The other
3bd0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
3be0: 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  is structure.  *
3bf0: 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e  * are either con
3c00: 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74  stant throughout
3c10: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3c20: 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65   the pager, or e
3c30: 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f  lse.  ** used to
3c40: 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61   store configura
3c50: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
3c60: 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20  that affect the 
3c70: 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20  way the pager . 
3c80: 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20   ** operates..  
3c90: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61  **.  ** The 'sta
3ca0: 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20  te' variable is 
3cb0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72  described in mor
3cc0: 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77  e detail along w
3cd0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  ith the.  ** des
3ce0: 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65  criptions of the
3cf0: 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74   values it may t
3d00: 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f  ake - PAGER_UNLO
3d10: 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20  CK etc. Many of 
3d20: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76  the.  ** other v
3d30: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73  ariables in this
3d40: 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72   block are descr
3d50: 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ibed in the comm
3d60: 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20  ent directly .  
3d70: 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c  ** above this cl
3d80: 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ass definition..
3d90: 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b    */.  u8 state;
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
3dc0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
3dd0: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
3de0: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e00: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
3e10: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
3e20: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
3e30: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3e50: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
3e60: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
3e70: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
3e80: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
3e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3ea0: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
3eb0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
3ec0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
3ed0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
3ee0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
3ef0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
3f00: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
3f10: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f30: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3f40: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3f50: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3f60: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
3f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3f80: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3f90: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3fa0: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3fb0: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
3fc0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3fd0: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
3fe0: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
3ff0: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
4000: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
4010: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
4020: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
4030: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
4040: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
4050: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4060: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4070: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
4080: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
4090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
40a0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
40b0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
40c0: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
40d0: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
40e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
40f0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
4100: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4110: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4130: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
4140: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
4150: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
4180: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
4190: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
41a0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
41b0: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
41c0: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
41d0: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
41e0: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
41f0: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
4220: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
4230: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
4240: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
4250: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
4260: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
4270: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
4280: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4290: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
42a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
42b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
42c0: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
42d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
42e0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
42f0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4300: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
4310: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4320: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
4330: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
4340: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
4350: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
4360: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
4370: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4380: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
4390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
43a0: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
43b0: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
43c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
43d0: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
43e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
43f0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
4400: 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a  eLimit;       /*
4410: 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20   Size limit for 
4420: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
4430: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50 61  al files */.  Pa
4440: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53  gerSavepoint *aS
4450: 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72  avepoint; /* Arr
4460: 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76  ay of active sav
4470: 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  epoints */.  int
4480: 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20   nSavepoint;    
4490: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
44a0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
44b0: 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a  n aSavepoint[] *
44c0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
44d0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
44e0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
44f0: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
4500: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  e changes */.  u
4510: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
4520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
4530: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
4540: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
4550: 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78 74  k */..  u16 nExt
4560: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
4570: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
4580: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
4590: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
45a0: 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73 65  e */.  i16 nRese
45b0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
45c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
45d0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74 20  unused bytes at 
45e0: 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  end of each page
45f0: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
4600: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
4610: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
4620: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
4630: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  () */.  int page
4640: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4650: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4660: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
4670: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
4680: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4690: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
46a0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
46b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
46c0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
46d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
46e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
46f0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
4700: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
4710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4730: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
4740: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
4750: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
4760: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
4770: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
4780: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
4790: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
47a0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
47b0: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66  syHandler */.#if
47c0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
47d0: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
47e0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
47f0: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
4800: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
4810: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
4820: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4830: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
4840: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
4850: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
4860: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
4870: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
4880: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
4890: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
48a0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48b0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
48c0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
48d0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
48e0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
48f0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
4900: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
4910: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
4920: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
4930: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
4940: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
4950: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
4960: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
4970: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
4980: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
49a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
49b0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
49c0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
49d0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
49e0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
49f0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
4a00: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
4a10: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
4a20: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
4a30: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
4a40: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
4a50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
4a60: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
4a70: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
4a80: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
4a90: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
4aa0: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
4ab0: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
4ac0: 2f 0a 20 20 4c 6f 67 20 2a 70 4c 6f 67 3b 20 20  /.  Log *pLog;  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 2f 2a 20 4c 6f 67 20 75 73 65 64 20 62 79 20 22  /* Log used by "
4af0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
4b00: 22 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  " */.};../*.** T
4b10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
4b20: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
4b30: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
4b40: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
4b50: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
4b60: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
4b70: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
4b80: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
4b90: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
4ba0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
4bb0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
4bc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
4bd0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
4be0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
4bf0: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4c00: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4c10: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
4c20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c30: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
4c40: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
4c50: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4c60: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
4c70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
4c80: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
4c90: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4ca0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
4cb0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
4cc0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
4cd0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
4ce0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
4cf0: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
4d00: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
4d10: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
4d20: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
4d30: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
4d40: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
4d50: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4d60: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
4d70: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
4d80: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
4d90: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
4da0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
4db0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
4dc0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
4dd0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
4de0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
4df0: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
4e00: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
4e10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
4e20: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
4e30: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
4e40: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
4e50: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
4e60: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
4e70: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
4e80: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
4e90: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
4ea0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
4eb0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
4ec0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
4ed0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
4ee0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
4ef0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
4f00: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
4f10: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
4f20: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
4f30: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
4f40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
4f50: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
4f60: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
4f70: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
4f80: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
4f90: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
4fa0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
4fb0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
4fc0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
4fd0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
4fe0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
4ff0: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
5000: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
5010: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
5020: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
5030: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
5040: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
5050: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
5060: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
5070: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5080: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
5090: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
50a0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
50b0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
50c0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
50d0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
50e0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
50f0: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
5100: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
5110: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
5120: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
5130: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
5140: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
5150: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
5160: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
5170: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
5180: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
5190: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
51a0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
51b0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
51c0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
51d0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
51e0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
51f0: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
5200: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
5210: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
5220: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
5230: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
5240: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
5250: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
5260: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
5270: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
5280: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
5290: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
52a0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
52b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
52c0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
52d0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
52e0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
52f0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
5300: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
5310: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
5320: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5330: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
5340: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
5350: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
5360: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
5370: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
5380: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
5390: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
53a0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
53b0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
53c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
53d0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
53e0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
53f0: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
5400: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
5410: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
5420: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
5430: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
5440: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
5450: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
5460: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
5470: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
5480: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
5490: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
54a0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
54b0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
54c0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
54d0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
54e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
54f0: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
5500: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
5510: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
5520: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
5530: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
5540: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
5550: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
5560: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
5570: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
5580: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 23 69 66   2147483647..#if
5590: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a  ndef NDEBUG ./*.
55a0: 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20  ** Usage:.**.** 
55b0: 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
55c0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
55d0: 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69  ger) );.*/.stati
55e0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
55f0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
5600: 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41  pPager){..  /* A
5610: 20 74 65 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c   temp-file is al
5620: 77 61 79 73 20 69 6e 20 50 41 47 45 52 5f 45 58  ways in PAGER_EX
5630: 43 4c 55 53 49 56 45 20 6f 72 20 50 41 47 45 52  CLUSIVE or PAGER
5640: 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2e 20 2a  _SYNCED state. *
5650: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
5660: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
5670: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
5680: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
5690: 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63  E );..  /* The c
56a0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
56b0: 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20 73 65  lag is always se
56c0: 74 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  t for temp-files
56d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
56e0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
56f0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
5700: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
5710: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
5720: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
5730: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
5740: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
5750: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
5760: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
5770: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
5780: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
5790: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
57a0: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
57b0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
57c0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
57d0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
57e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
57f0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
5800: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
5810: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
5820: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
5830: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
5840: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
5850: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
5860: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
5870: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
5880: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
5890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
58a0: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
58b0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
58c0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
58d0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
58e0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
58f0: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
5900: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
5910: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
5920: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
5930: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
5940: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
5950: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
5960: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
5970: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
5980: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
5990: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
59a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
59b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
59c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
59d0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
59e0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
59f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
5a00: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
5a10: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
5a20: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5a30: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
5a40: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
5a50: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
5a60: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
5a70: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
5a80: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
5a90: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
5aa0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
5ab0: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
5ac0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
5ad0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
5ae0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
5af0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
5b00: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
5b10: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
5b20: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
5b30: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
5b40: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
5b50: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
5b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5b70: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
5b80: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
5b90: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
5ba0: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
5bb0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
5bc0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
5bd0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
5be0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
5bf0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5c00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
5c10: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
5c20: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
5c30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5c40: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
5c50: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
5c60: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
5c70: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
5c80: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
5c90: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
5ca0: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
5cb0: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
5cc0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
5cd0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
5ce0: 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
5cf0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
5d00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
5d10: 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  * on success or 
5d20: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
5d30: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5d40: 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
5d50: 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73   int write32bits
5d60: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
5d70: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
5d80: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
5d90: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
5da0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
5db0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
5dc0: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20  rite(fd, ac, 4, 
5dd0: 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  offset);.}../*.*
5de0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
5df0: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
5e00: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
5e10: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
5e20: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
5e30: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
5e40: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
5e50: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
5e60: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
5e70: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
5e80: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
5e90: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
5ea0: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
5eb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
5ec0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
5ed0: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
5ee0: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
5ef0: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
5f00: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
5f10: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
5f20: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49  ethods)../*.** I
5f30: 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70  f file pFd is op
5f40: 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  en, call sqlite3
5f50: 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74  OsUnlock() on it
5f60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f70: 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  osUnlock(sqlite3
5f80: 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20  _file *pFd, int 
5f90: 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 69  eLock){.  if( !i
5fa0: 73 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a 20 20  sOpen(pFd) ){.  
5fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fc0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
5fd0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
5fe0: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
5ff0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6000: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
6010: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
6020: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
6030: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
6040: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
6050: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
6060: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
6070: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
6080: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
6090: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
60a0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
60b0: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
60c0: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
60d0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
60e0: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
60f0: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
6100: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
6110: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
6120: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
6130: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
6140: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
6150: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
6160: 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  * The optimizati
6170: 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79  on is also alway
6180: 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65  s enabled for te
6190: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49  mporary files. I
61a0: 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  t is.** an error
61b0: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
61c0: 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72  nction if pPager
61d0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e   is opened on an
61e0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
61f0: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
6200: 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
6210: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  n cannot be used
6220: 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e  , 0 is returned.
6230: 20 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73   If it can be us
6240: 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ed,.** then the 
6250: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
6260: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
6270: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
6280: 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69  hen it.** contai
6290: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
62a0: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
62b0: 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   page..*/.#ifdef
62c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
62d0: 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74  TOMIC_WRITE.stat
62e0: 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65  ic int jrnlBuffe
62f0: 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  rSize(Pager *pPa
6300: 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
6310: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
6320: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
6330: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b  e ){.    int dc;
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
6360: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
6370: 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tics */.    int 
6380: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20  nSector;        
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63a0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
63b0: 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20      int szPage; 
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
63e0: 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ze */..    asser
63f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
6400: 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20  ->fd) );.    dc 
6410: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
6420: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
6430: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
6440: 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67    nSector = pPag
6450: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
6460: 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61      szPage = pPa
6470: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a  ger->pageSize;..
6480: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
6490: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
64a0: 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
64b0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
64c0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
64d0: 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
64e0: 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51    if( 0==(dc&(SQ
64f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
6500: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c  C|(szPage>>8)) |
6510: 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65  | nSector>szPage
6520: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
6530: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 0;.    }.  }..
6540: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
6550: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6560: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
6570: 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69  pPager);.}.#endi
6580: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  f../*.** If SQLI
6590: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69  TE_CHECK_PAGES i
65a0: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77  s defined then w
65b0: 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79  e do some sanity
65c0: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20   checking.** on 
65d0: 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20  the cache using 
65e0: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e  a hash function.
65f0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
6600: 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e  or testing.** an
6610: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
6620: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
6630: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
6640: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
6650: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
6660: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
6670: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
6680: 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61  u32 pager_dataha
6690: 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e  sh(int nByte, un
66a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
66b0: 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20  ta){.  u32 hash 
66c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
66d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65  for(i=0; i<nByte
66e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68  ; i++){.    hash
66f0: 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b   = (hash*1039) +
6700: 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20   pData[i];.  }. 
6710: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
6720: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
6730: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
6740: 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
6750: 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  n pager_datahash
6760: 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  (pPage->pPager->
6770: 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67  pageSize, (unsig
6780: 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65  ned char *)pPage
6790: 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74  ->pData);.}.stat
67a0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65  ic void pager_se
67b0: 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  t_pagehash(PgHdr
67c0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67   *pPage){.  pPag
67d0: 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  e->pageHash = pa
67e0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61  ger_pagehash(pPa
67f0: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ge);.}../*.** Th
6800: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
6810: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
6820: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
6830: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
6840: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
6850: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
6860: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
6870: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
6880: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
6890: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
68a0: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
68b0: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
68c0: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
68d0: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
68e0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
68f0: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
6900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
6910: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
6920: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
6930: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
6940: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  r;.  assert( !pP
6950: 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70  g->pageHash || p
6960: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20  Pager->errCode. 
6970: 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c       || (pPg->fl
6980: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
6990: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
69a0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
69b0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
69c0: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
69d0: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
69e0: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
69f0: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
6a00: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
6a10: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
6a20: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
6a30: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
6a40: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
6a50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6a60: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
6a70: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
6a80: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6a90: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
6aa0: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
6ab0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
6ac0: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
6ad0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
6ae0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
6af0: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
6b00: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
6b10: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
6b20: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
6b30: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
6b40: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
6b50: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
6b60: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
6b70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
6b80: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
6b90: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
6ba0: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
6bb0: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
6bc0: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
6bd0: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
6be0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
6bf0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
6c00: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
6c10: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
6c20: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
6c30: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
6c40: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
6c50: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
6c60: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
6c70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6c80: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
6c90: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
6ca0: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
6cb0: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
6cc0: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
6cd0: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
6ce0: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
6cf0: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
6d00: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
6d10: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
6d20: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
6d30: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
6d40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
6d50: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
6d60: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6d70: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
6d80: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
6d90: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
6da0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
6db0: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
6dc0: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
6dd0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
6de0: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
6df0: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
6e00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6e10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
6e20: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
6e30: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
6e40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
6e50: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
6e60: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
6e70: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
6e80: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
6e90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6ea0: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
6eb0: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
6ec0: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
6ed0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
6ee0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6ef0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6f00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
6f10: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
6f20: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
6f30: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
6f40: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f60: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6f70: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6f90: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
6fa0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6fb0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
6fc0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
6fd0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
6fe0: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
6ff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
7000: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
7010: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
7020: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
7030: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
7040: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
7050: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
7060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
7070: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
7080: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
7090: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
70a0: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
70b0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
70c0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
70d0: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
70e0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
70f0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
7100: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
7110: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
7120: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
7130: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
7140: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
7150: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
7160: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
7170: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
7180: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
7190: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
71a0: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
71b0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
71c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
71d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
71e0: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
71f0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
7200: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
7210: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
7220: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
7230: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
7240: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
7250: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
7260: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7270: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
7280: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
7290: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
72a0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
72b0: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
72c0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
72d0: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
72e0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
72f0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
7300: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
7310: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
7320: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
7330: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
7340: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
7350: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7360: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
7370: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
7380: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
7390: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
73a0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
73b0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
73c0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
73d0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
73e0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
73f0: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
7400: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
7410: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
7420: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7430: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
7440: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
7450: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
7460: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
7470: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
7480: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
7490: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
74a0: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
74b0: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
74c0: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
74d0: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
74e0: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
74f0: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
7500: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
7510: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
7520: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
7530: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
7560: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
7580: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
75a0: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
75f0: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
7600: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
7610: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
7620: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
7630: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
7640: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
7650: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
7660: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
7670: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7680: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
7690: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
76a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
76b0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
76c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
76d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
76e0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
76f0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
7700: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7710: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
7720: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
7730: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
7740: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7750: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
7760: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
7770: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
7780: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
7790: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
77a0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
77b0: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
77c0: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
77d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
77e0: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
77f0: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
7800: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
7810: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
7820: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
7830: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
7840: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
7850: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
7860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7870: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
7880: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
7890: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
78a0: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
78b0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
78c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
78d0: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
78e0: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
78f0: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
7900: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
7910: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7920: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
7930: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
7940: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
7950: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
7960: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
7970: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
7980: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
7990: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
79a0: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
79b0: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
79c0: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
79d0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
79e0: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
79f0: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
7a00: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
7a10: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
7a20: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
7a30: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
7a40: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
7a50: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
7a60: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
7a70: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
7a80: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
7a90: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
7aa0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
7ab0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
7ac0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
7ad0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
7ae0: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
7af0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
7b00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
7b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
7b20: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
7b30: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
7b40: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
7b50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7b60: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7b90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
7ba0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
7bb0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7bc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
7bd0: 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c      const i64 iL
7be0: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
7bf0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
7c00: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
7c10: 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20  he of jsl */..  
7c20: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
7c30: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
7c40: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
7c50: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
7c60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
7c70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
7c80: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
7c90: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
7ca0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
7cb0: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
7cc0: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20  [28] = {0};.    
7cd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7ce0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7cf0: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
7d00: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
7d10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7d20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7d30: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
7d40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
7d50: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
7d60: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
7d70: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
7d80: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
7d90: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7da0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
7db0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
7dc0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
7dd0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
7de0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
7df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
7e00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
7e10: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
7e20: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
7e30: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
7e40: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
7e50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
7e60: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
7e70: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
7e80: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
7e90: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
7ea0: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
7eb0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
7ec0: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
7ed0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
7ee0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
7ef0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
7f00: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7f10: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
7f20: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
7f30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7f40: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
7f50: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
7f60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7f70: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
7f80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
7f90: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
7fa0: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
7fb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
7fc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
7fd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7fe0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
7ff0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
8000: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
8010: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
8020: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
8030: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8040: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
8050: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
8060: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
8070: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
8080: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
8090: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
80a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
80b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
80c0: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
80d0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
80e0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
80f0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
8100: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
8110: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
8120: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
8130: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
8140: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
8150: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
8160: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
8170: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
8180: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
8190: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
81a0: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
81b0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
81c0: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
81d0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
81e0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
81f0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
8200: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
8210: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
8220: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
8230: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
8240: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
8250: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
8260: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
8270: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
8280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
8290: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
82a0: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
82b0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
82c0: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
82d0: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
82e0: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
82f0: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  32 nHeader = pPa
8300: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
8310: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
8320: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
8330: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
8340: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
8370: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
8380: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
8390: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
83c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
83d0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
83e0: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
83f0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
8400: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
8410: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
8420: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
8430: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
8440: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
8450: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
8460: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8470: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
8480: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
8490: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
84a0: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
84b0: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
84c0: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
84d0: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
84e0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
84f0: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
8500: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
8510: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
8520: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
8530: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
8540: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
8550: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
8560: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
8570: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
8580: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
8590: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
85a0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
85b0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
85c0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
85d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
85e0: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
85f0: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
8600: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
8610: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
8620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
8630: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
8640: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
8650: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
8660: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
8670: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
8680: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
8690: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
86a0: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
86b0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
86c0: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
86d0: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
86e0: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
86f0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
8700: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
8710: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
8720: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
8730: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
8740: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
8750: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
8760: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
8770: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
8780: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
8790: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
87a0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
87b0: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
87c0: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
87d0: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
87e0: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
87f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
8800: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
8810: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
8820: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
8830: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
8840: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
8850: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
8860: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
8870: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
8880: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
8890: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
88a0: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
88b0: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
88c0: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
88d0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
88e0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
88f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
8900: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
8910: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
8920: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
8930: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
8940: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
8950: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
8960: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
8970: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
8980: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
8990: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
89a0: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
89b0: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
89c0: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
89d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
89e0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
89f0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
8a00: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
8a10: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 28  oSync );.  if( (
8a20: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
8a30: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
8a40: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
8a50: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
8a60: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
8a70: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
8a80: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
8a90: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
8aa0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
8ab0: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
8ac0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
8ad0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
8ae0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
8af0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
8b00: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
8b20: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
8b30: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
8b40: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
8b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8b60: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
8b70: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
8b80: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
8b90: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
8ba0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
8bb0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
8bc0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
8bd0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
8be0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
8bf0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8c00: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
8c10: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
8c20: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
8c30: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
8c40: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
8c50: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
8c60: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
8c70: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
8c80: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
8c90: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
8ca0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
8cb0: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
8cc0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
8cd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
8ce0: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
8cf0: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
8d00: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
8d10: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8d20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8d30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
8d40: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8d50: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
8d60: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
8d70: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
8d80: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
8d90: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
8da0: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
8db0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
8dc0: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
8dd0: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
8de0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
8df0: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
8e00: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
8e10: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
8e20: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
8e30: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
8e40: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
8e50: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
8e60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8e70: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
8e80: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
8e90: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
8ea0: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
8eb0: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
8ec0: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
8ed0: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
8ee0: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
8ef0: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
8f00: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
8f10: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
8f20: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
8f30: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
8f40: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
8f50: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
8f60: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
8f70: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
8f80: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
8f90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
8fa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
8fb0: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
8fc0: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
8fd0: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
8fe0: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
8ff0: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
9000: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
9010: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
9020: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
9030: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
9040: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
9050: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
9060: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
9070: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
9080: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
9090: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
90a0: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
90b0: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
90c0: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
90d0: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
90e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
90f0: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
9100: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
9110: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
9120: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
9130: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
9140: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
9150: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
9160: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
9170: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
9180: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
9190: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
91a0: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
91b0: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
91c0: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
91d0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
91e0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
91f0: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
9200: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
9210: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
9220: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
9230: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9240: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
9250: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
9260: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
9270: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
9280: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
9290: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
92a0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
92b0: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
92c0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
92d0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
92e0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
92f0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
9300: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
9310: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
9320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
9330: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
9340: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9350: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
9360: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
9370: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9380: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
9390: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
93a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
93b0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
93c0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
93d0: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
93e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
93f0: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
9400: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
9410: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
9420: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
9430: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
9440: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
9450: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9470: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
9480: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
9490: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
94a0: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
94b0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
94c0: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
94d0: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
94e0: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
94f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
9500: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
9510: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
9520: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
9530: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
9540: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
9550: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
9560: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
9570: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
9580: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
9590: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
95a0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
95b0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
95c0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
95d0: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
95e0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
95f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
9600: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
9610: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
9620: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
9630: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
9640: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
9650: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
9660: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
9670: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
9680: 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
9690: 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
96a0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
96b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
96c0: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
96d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
96e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
96f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
9700: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9710: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
9720: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
9730: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
9740: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
9750: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
9760: 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
9770: 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
9780: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9790: 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
97a0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
97b0: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
97e0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
97f0: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
9800: 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
9810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
9820: 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
9830: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
9840: 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
9850: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9870: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9880: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
9890: 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
98a0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
98b0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
98c0: 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
98d0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
98e0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
98f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9900: 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
9910: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
9920: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
9930: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
9940: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
9950: 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
9960: 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
9970: 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
9980: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
9990: 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
99a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
99b0: 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
99c0: 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
99d0: 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
99e0: 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
99f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9a00: 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
9a10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9a20: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
9a30: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
9a40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9a50: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
9a60: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
9a70: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
9a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
9a90: 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
9aa0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
9ab0: 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
9ac0: 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
9ad0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
9ae0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
9af0: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
9b00: 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
9b10: 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
9b20: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9b30: 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
9b40: 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
9b50: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
9b60: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
9b70: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
9b80: 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
9b90: 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
9ba0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
9bb0: 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
9bc0: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
9bd0: 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
9be0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
9bf0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
9c00: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
9c10: 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
9c20: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
9c30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c40: 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
9c50: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
9c60: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9c70: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
9c80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9c90: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
9ca0: 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
9cb0: 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
9cc0: 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
9cd0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9ce0: 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
9cf0: 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
9d00: 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
9d10: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
9d20: 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
9d30: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
9d40: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
9d50: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
9d60: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
9d70: 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
9d80: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
9d90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9da0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
9db0: 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
9dc0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
9dd0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
9de0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9df0: 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
9e00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
9e10: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
9e20: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
9e30: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9e40: 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
9e50: 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
9e60: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
9e70: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
9e80: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
9e90: 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9eb0: 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
9ec0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
9ed0: 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
9ee0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
9ef0: 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
9f00: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
9f10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
9f20: 0a 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69  .    u16 iPageSi
9f30: 7a 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20  ze16;           
9f40: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61    /* Copy of iPa
9f50: 67 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74  geSize in 16-bit
9f60: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20   variable */..  
9f70: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
9f80: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
9f90: 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20  or-size journal 
9fa0: 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a  header fields. *
9fb0: 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  /.    if( SQLITE
9fc0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
9fd0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
9fe0: 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26  d, iHdrOff+20, &
9ff0: 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20  iSectorSize)).  
a000: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
a010: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
a020: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
a030: 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67  HdrOff+24, &iPag
a040: 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20  eSize)).    ){. 
a050: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
a060: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
a070: 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
a080: 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
a090: 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
a0a0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  sector-size fiel
a0b0: 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69  ds.    ** are wi
a0c0: 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62  thin range. To b
a0d0: 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f  e 'in range', bo
a0e0: 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74  th values need t
a0f0: 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20  o be a power.   
a100: 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74   ** of two great
a110: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
a120: 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61   to 512 or 32, a
a130: 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74  nd not greater t
a140: 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a  han their .    *
a150: 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d  * respective com
a160: 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75  pile time maximu
a170: 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f  m limits..    */
a180: 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
a190: 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20  ze<512          
a1a0: 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74          || iSect
a1b0: 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c  orSize<32.     |
a1c0: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
a1d0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
a1e0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
a1f0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
a200: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
a210: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
a220: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
a230: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
a240: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
a250: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
a260: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
a270: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
a280: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
a290: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
a2a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
a2b0: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
a2c0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
a2d0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
a2e0: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
a2f0: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
a300: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
a310: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
a320: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
a330: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
a340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a350: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
a360: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a370: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
a380: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
a390: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
a3a0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
a3b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
a3c0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
a3d0: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
a3e0: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
a3f0: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
a400: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
a410: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
a420: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
a430: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
a440: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
a450: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
a460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a470: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
a480: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
a490: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
a4a0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
a4b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
a4c0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
a4d0: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
a4e0: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
a4f0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
a500: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
a510: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
a520: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
a530: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
a540: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
a550: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
a560: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
a570: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
a580: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
a590: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
a5a0: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
a5b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
a5c0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
a5d0: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
a5e0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
a5f0: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
a600: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
a610: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
a620: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
a630: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
a640: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
a650: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
a660: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
a670: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
a680: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
a690: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a6a0: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
a6b0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
a6c0: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
a6d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a6e0: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
a6f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
a700: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
a710: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
a720: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
a730: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
a740: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
a750: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
a760: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
a770: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
a780: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
a790: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
a7a0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
a7b0: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
a7c0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
a7d0: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
a7e0: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
a7f0: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
a800: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
a810: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
a820: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
a830: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
a840: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a850: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
a860: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
a870: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
a880: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a890: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
a8a0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
a8b0: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
a8c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a8d0: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
a8e0: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
a8f0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
a900: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
a910: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
a920: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
a930: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
a940: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
a950: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
a960: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
a970: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
a980: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
a990: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
a9a0: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
a9b0: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
a9c0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
a9d0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
a9e0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
a9f0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
aa00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
aa10: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
aa20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
aa30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
aa40: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
aa70: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
aa80: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aaa0: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
aab0: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
aac0: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aae0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
aaf0: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
ab00: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
ab10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
ab20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ab30: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
ab40: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
ab50: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab70: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
ab80: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
ab90: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
aba0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
abb0: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
abc0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
abd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
abe0: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
abf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
ac00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ac10: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
ac20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ac30: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
ac40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
ac50: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
ac60: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
ac70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
ac80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
ac90: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
aca0: 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a  rnalOff );..  /*
acb0: 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c   Calculate the l
acc0: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61  ength in bytes a
acd0: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
ace0: 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  of zMaster */.  
acf0: 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a  for(nMaster=0; z
ad00: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
ad10: 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20   nMaster++){.   
ad20: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
ad30: 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a  r[nMaster];.  }.
ad40: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
ad50: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
ad60: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
ad70: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
ad80: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
ad90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ada0: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
adb0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
adc0: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
add0: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
ade0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
adf0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
ae00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
ae10: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
ae20: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ae30: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
ae40: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
ae50: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
ae60: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ae70: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  lOff;..  /* Writ
ae80: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
ae90: 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65  rnal data to the
aea0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
aeb0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a  nal file. If.  *
aec0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
aed0: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  s, return the er
aee0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
aef0: 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  caller..  */.  i
af00: 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  f( (0 != (rc = w
af10: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
af20: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c  r->jfd, iHdrOff,
af30: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
af40: 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20  Pager)))).   || 
af50: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
af60: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
af70: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
af80: 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66   nMaster, iHdrOf
af90: 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  f+4))).   || (0 
afa0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
afb0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
afc0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
afd0: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a  ter, nMaster))).
afe0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
aff0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
b000: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
b010: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20  ff+4+nMaster+4, 
b020: 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28  cksum))).   || (
b030: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
b040: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b050: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
b060: 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66  agic, 8, iHdrOff
b070: 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a  +4+nMaster+8))).
b080: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
b090: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
b0a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
b0b0: 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20  (nMaster+20);.  
b0c0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
b0d0: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
b0e0: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
b0f0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
b100: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
b110: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
b120: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
b130: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
b140: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
b150: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
b160: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
b170: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
b180: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
b190: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b1a0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
b1b0: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
b1c0: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
b1d0: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
b1e0: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
b1f0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
b200: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
b210: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
b220: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
b230: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
b240: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
b250: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
b260: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
b270: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
b280: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
b290: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
b2a0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
b2b0: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
b2c0: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
b2d0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
b2e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b2f0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
b300: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
b310: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
b320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
b330: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
b340: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
b350: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
b360: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
b370: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b380: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
b390: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
b3a0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
b3b0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
b3c0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
b3d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b3e0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
b3f0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
b400: 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
b410: 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
b420: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
b430: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
b440: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
b450: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
b460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
b480: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
b490: 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
b4a0: 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
b4b0: 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
b4c0: 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
b4d0: 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
b4e0: 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
b4f0: 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
b500: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
b510: 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
b520: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
b530: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
b540: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
b550: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
b560: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
b570: 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
b580: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
b590: 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c  ate, discard all
b5a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
b5b0: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  . If.** the page
b5c0: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
b5d0: 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  ate, then this c
b5e0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
b5f0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20  **.** TODO: Why 
b600: 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74  can we not reset
b610: 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65   the pager while
b620: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f   in error state?
b630: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b640: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
b650: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
b660: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61  ( SQLITE_OK==pPa
b670: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b680: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
b690: 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
b6a0: 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73  >pBackup);.    s
b6b0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
b6c0: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
b6d0: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
b6e0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
b6f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
b700: 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
b710: 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
b720: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
b730: 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
b740: 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
b750: 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
b760: 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
b770: 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
b780: 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
b790: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
b7a0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
b7b0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
b7c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
b7d0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
b7e0: 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
b7f0: 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
b800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b810: 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
b820: 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
b830: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
b840: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
b850: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
b860: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
b870: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
b880: 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
b890: 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
b8a0: 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
b8b0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
b8c0: 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
b8d0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
b8e0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
b8f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
b900: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  lose(pPager->sjf
b910: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
b920: 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61  3_free(pPager->a
b930: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50  Savepoint);.  pP
b940: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
b950: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b960: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
b970: 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
b980: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
b990: 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62  Set the bit numb
b9a0: 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50  er pgno in the P
b9b0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
b9c0: 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62  nSavepoint .** b
b9d0: 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70  itvecs of all op
b9e0: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52  en savepoints. R
b9f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ba00: 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a  if successful.**
ba10: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   or SQLITE_NOMEM
ba20: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
ba30: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  lure occurs..*/.
ba40: 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f  static int addTo
ba50: 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
ba60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ba70: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
ba80: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
baa0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
bab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bac0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
bad0: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28   code */..  for(
bae0: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
baf0: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
bb00: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
bb10: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
bb20: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
bb30: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
bb40: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
bb50: 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74       rc |= sqlit
bb60: 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70  e3BitvecSet(p->p
bb70: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
bb80: 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  o);.      testca
bb90: 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
bba0: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73  OMEM );.      as
bbb0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
bbc0: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
bbd0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d  E_NOMEM );.    }
bbe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
bc00: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
bc10: 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
bc20: 6c 6f 67 20 66 69 6c 65 20 66 6f 72 20 70 61 67  log file for pag
bc30: 65 72 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 73 74  er pPager..*/.st
bc40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
bc50: 65 6e 4c 6f 67 28 50 61 67 65 72 20 2a 70 50 61  enLog(Pager *pPa
bc60: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
bc70: 67 65 72 2d 3e 70 4c 6f 67 20 29 7b 0a 20 20 20  ger->pLog ){.   
bc80: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bca0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
bcb0: 6f 6d 20 4c 6f 67 4f 70 65 6e 28 29 20 2a 2f 0a  om LogOpen() */.
bcc0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
bcd0: 33 4c 6f 67 4f 70 65 6e 28 70 50 61 67 65 72 2d  3LogOpen(pPager-
bce0: 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
bcf0: 46 69 6c 65 6e 61 6d 65 2c 20 26 70 50 61 67 65  Filename, &pPage
bd00: 72 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 69 66  r->pLog);.    if
bd10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bd20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
bd30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bd40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
bd50: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
bd60: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
bd70: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69  rite-ahead log i
bd80: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
bd90: 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  ual.** rollback 
bda0: 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69  journal. Otherwi
bdb0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  se false..*/.sta
bdc0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
bdd0: 4c 6f 67 28 50 61 67 65 72 20 2a 70 50 61 67 65  Log(Pager *pPage
bde0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
bdf0: 61 67 65 72 2d 3e 70 4c 6f 67 21 3d 30 29 3b 0a  ager->pLog!=0);.
be00: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
be10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
be20: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
be30: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
be40: 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69  he pager.** is i
be50: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
be60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
be70: 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
be80: 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  y in error state
be90: 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f  , discard the co
bea0: 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68  ntents of .** th
beb0: 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65  e cache and rese
bec0: 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  t the Pager stru
bed0: 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73  cture internal s
bee0: 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69  tate. If there i
bef0: 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  s.** an open jou
bf00: 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20  rnal-file, then 
bf10: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20  the next time a 
bf20: 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f  shared-lock is o
bf30: 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68  btained.** on th
bf40: 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79  e pager file (by
bf50: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
bf60: 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20  er process), it 
bf70: 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74  will be.** treat
bf80: 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ed as a hot-jour
bf90: 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
bfa0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
bfb0: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
bfc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bfd0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
bfe0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
bff0: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
c000: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
c010: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
c020: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61   */..    /* Alwa
c030: 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ys close the jou
c040: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
c050: 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
c060: 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a  base lock..    *
c070: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f  * Otherwise, ano
c080: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
c090: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
c0a0: 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20  e=delete might. 
c0b0: 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
c0c0: 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75   file out from u
c0d0: 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
c0e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c0f0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
c100: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
c110: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
c120: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
c130: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
c140: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72  urnal = 0;.    r
c150: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
c160: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
c170: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
c180: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f   is unlocked, so
c190: 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68  mebody else migh
c1a0: 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65  t change it. The
c1b0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73  .    ** values s
c1c0: 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64  tored in Pager.d
c1d0: 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74  bSize etc. might
c1e0: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20   become invalid 
c1f0: 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68  if.    ** this h
c200: 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e  appens.  One can
c210: 20 61 72 67 75 65 20 74 68 61 74 20 74 68 69 73   argue that this
c220: 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f   doesn't need to
c230: 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20   be cleared.    
c240: 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61  ** until the cha
c250: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63  nge-counter chec
c260: 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72  k fails in Pager
c270: 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20  SharedLock()..  
c280: 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74 68    ** Clearing th
c290: 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 63 68  e page size cach
c2a0: 65 20 68 65 72 65 20 69 73 20 62 65 69 6e 67 20  e here is being 
c2b0: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20 20  conservative..  
c2c0: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
c2d0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
c2e0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
c2f0: 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29  UseLog(pPager) )
c300: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c  {.      sqlite3L
c310: 6f 67 43 6c 6f 73 65 53 6e 61 70 73 68 6f 74 28  ogCloseSnapshot(
c320: 70 50 61 67 65 72 2d 3e 70 4c 6f 67 29 3b 0a 20  pPager->pLog);. 
c330: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
c340: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
c350: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
c360: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
c370: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c380: 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   = rc;.    }.   
c390: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
c3a0: 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
c3b0: 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67  )..    /* If Pag
c3c0: 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65  er.errCode is se
c3d0: 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  t, the contents 
c3e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
c3f0: 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20  he cannot be.   
c400: 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
c410: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
c420: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
c430: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
c440: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63  f the.    ** cac
c450: 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
c460: 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ded and the erro
c470: 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c  r code safely cl
c480: 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
c490: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
c4a0: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69  rCode ){.      i
c4b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
c4d0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
c4e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
c4f0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
c500: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
c510: 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  }..    pPager->c
c520: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
c530: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
c540: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
c550: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
c560: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
c570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
c580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
c590: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
c5a0: 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52  en an IOERR, COR
c5b0: 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72  RUPT or FULL err
c5c0: 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f  or.** may have o
c5d0: 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69 72  ccurred. The fir
c5e0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
c5f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c600: 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74  pager .** struct
c610: 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
c620: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
c630: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
c640: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 0a  ned by a pager .
c650: 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  ** API function.
c660: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
c670: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
c680: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
c690: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73  ment .** to this
c6a0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
c6b0: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
c6c0: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
c6d0: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
c6e0: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
c6f0: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
c700: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
c710: 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20  rsistent. Until 
c720: 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72  the persisten er
c730: 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a  ror is cleared,.
c740: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50  ** subsequent AP
c750: 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20  I calls on this 
c760: 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
c770: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68  iately return th
c780: 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72  e same .** error
c790: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70   code..**.** A p
c7a0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
c7b0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
c7c0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
c7d0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
c7e0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
c7f0: 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
c800: 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
c810: 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
c820: 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
c830: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
c840: 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
c850: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
c860: 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
c870: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
c880: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
c890: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
c8a0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
c8b0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
c8c0: 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
c8d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
c8e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c8f0: 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
c900: 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
c910: 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
c920: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
c930: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c940: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
c950: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
c960: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
c970: 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20  TE_OK || !MEMDB 
c980: 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  );.  assert(.   
c990: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
c9a0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
c9b0: 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
c9c0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
c9d0: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
c9e0: 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
c9f0: 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
ca00: 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
ca10: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55  ( rc2==SQLITE_FU
ca20: 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54  LL || rc2==SQLIT
ca30: 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 70  E_IOERR ){.    p
ca40: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
ca50: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
ca60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
ca70: 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
ca80: 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
ca90: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
caa0: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
cab0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
cac0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
cad0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
cae0: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
caf0: 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
cb00: 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
cb10: 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
cb20: 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
cb30: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
cb40: 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
cb50: 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
cb60: 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
cb70: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
cb80: 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
cb90: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
cba0: 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74  file and clear t
cbb0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
cbc0: 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
cbd0: 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  at.** there is a
cbe0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66   hot-journal lef
cbf0: 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
cc00: 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63  stem, the next c
cc10: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  onnection.** to 
cc20: 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
cc30: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
cc40: 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
cc50: 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a  this one) will.*
cc60: 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  * roll it back..
cc70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
cc80: 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  er has not alrea
cc90: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
cca0: 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20  rror state, but 
ccb0: 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c  an IO or.** mall
ccc0: 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
ccd0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
cce0: 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c  k, then this wil
ccf0: 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a  l itself cause .
cd00: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
cd10: 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
cd20: 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c  state. Which wil
cd30: 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  l be cleared by 
cd40: 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  the.** call to p
cd50: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61  ager_unlock(), a
cd60: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
cd70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cd80: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
cd90: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
cda0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
cdb0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
cdc0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
cdd0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
cde0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
cdf0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
ce00: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
ce10: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
ce20: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
ce30: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
ce40: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
ce50: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
ce60: 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
ce70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ce80: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
ce90: 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
cea0: 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
ceb0: 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
cec0: 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
ced0: 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
cee0: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
cef0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
cf00: 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
cf10: 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
cf20: 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
cf30: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
cf40: 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
cf50: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
cf60: 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
cf70: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
cf80: 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
cf90: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
cfa0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
cfb0: 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
cfc0: 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47 45  R_SHARED or PAGE
cfd0: 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
cfe0: 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
cff0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
d000: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65  t is a no-op (re
d010: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29  turns SQLITE_OK)
d020: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
d030: 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61  e, any active sa
d040: 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c  vepoints are rel
d050: 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eased..**.** If 
d060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d070: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69   is open, then i
d080: 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22  t is "finalized"
d090: 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c  . Once a journal
d0a0: 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65   .** file has be
d0b0: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20  en finalized it 
d0c0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
d0d0: 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c  to use it to rol
d0e0: 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61  l back a .** tra
d0f0: 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69  nsaction. Nor wi
d100: 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65  ll it be conside
d110: 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d  red to be a hot-
d120: 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a  journal by this.
d130: 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  ** or any other 
d140: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d150: 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ion. Exactly how
d160: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69   a journal is fi
d170: 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e  nalized.** depen
d180: 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ds on whether or
d190: 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69   not the pager i
d1a0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d1b0: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a  lusive mode and.
d1c0: 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a  ** the current j
d1d0: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67  ournal-mode (Pag
d1e0: 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76  er.journalMode v
d1f0: 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77  alue), as follow
d200: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  s:.**.**   journ
d210: 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a  alMode==MEMORY.*
d220: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
d230: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
d240: 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20   simply closed. 
d250: 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e  This destroys an
d260: 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f   .**     in-memo
d270: 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  ry journal..**.*
d280: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
d290: 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  =TRUNCATE.**    
d2a0: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   Journal file is
d2b0: 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
d2c0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d2d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
d2e0: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a  lMode==PERSIST.*
d2f0: 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *     The first 
d300: 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  28 bytes of the 
d310: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
d320: 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e   zeroed. This in
d330: 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20  validates.**    
d340: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d350: 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
d360: 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65   file, and hence
d370: 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
d380: 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e  nal.**     file.
d390: 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72   An invalid jour
d3a0: 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20  nal file cannot 
d3b0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
d3c0: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
d3d0: 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20  ode==DELETE.**  
d3e0: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66     The journal f
d3f0: 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e  ile is closed an
d400: 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  d deleted using 
d410: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
d420: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20  )..**.**     If 
d430: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
d440: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
d450: 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74  e mode, this met
d460: 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e  hod of finalizin
d470: 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  g.**     the jou
d480: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
d490: 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64  er used. Instead
d4a0: 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
d4b0: 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44  Mode is.**     D
d4c0: 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61  ELETE and the pa
d4d0: 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
d4e0: 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65  ive mode, the me
d4f0: 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75  thod described u
d500: 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  nder.**     jour
d510: 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54  nalMode==PERSIST
d520: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
d530: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
d540: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  e journal is fin
d550: 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69  alized, if runni
d560: 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
d570: 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ive mode, the.**
d580: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
d590: 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
d5a0: 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64  te (and downgrad
d5b0: 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  es the lock on t
d5c0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
d5d0: 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29  ile accordingly)
d5e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
d5f0: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
d600: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
d610: 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45  e and is in PAGE
d620: 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a  R_SYNCED state,.
d630: 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50  ** it moves to P
d640: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20  AGER_EXCLUSIVE. 
d650: 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77  No locks are dow
d660: 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e  ngraded when run
d670: 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75  ning in.** exclu
d680: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
d690: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
d6a0: 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
d6b0: 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
d6c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
d6d0: 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
d6e0: 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
d6f0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
d700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
d710: 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
d720: 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
d730: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
d740: 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
d750: 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
d760: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
d770: 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
d780: 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
d790: 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
d7a0: 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
d7b0: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
d7c0: 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
d7d0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d7e0: 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
d7f0: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
d800: 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
d810: 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
d820: 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
d830: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
d840: 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
d850: 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
d860: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
d870: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
d880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
d890: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
d8a0: 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
d8b0: 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
d8c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
d8d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
d8e0: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
d8f0: 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
d900: 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
d910: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
d920: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
d930: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
d940: 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
d950: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
d960: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
d970: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
d980: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
d990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
d9a0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
d9b0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
d9c0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
d9d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
d9e0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
d9f0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
da00: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
da10: 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
da20: 74 28 20 21 70 61 67 65 72 55 73 65 4c 6f 67 28  t( !pagerUseLog(
da30: 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
da40: 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
da50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
da60: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
da70: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
da80: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
da90: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
daa0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
dab0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
dac0: 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20  E_MEMORY );.    
dad0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
dae0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
daf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
db00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
db10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
db20: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
db30: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
db40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
db50: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
db60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
db70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
db80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
db90: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
dba0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
dbb0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
dbc0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
dbd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dbe0: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
dbf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
dc00: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
dc10: 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  ode .     || pPa
dc20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
dc30: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
dc40: 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
dc50: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
dc60: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
dc70: 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
dc80: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
dc90: 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
dca0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
dcb0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
dcc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dcd0: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
dce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dcf0: 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
dd00: 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
dd10: 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
dd20: 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
dd30: 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
dd40: 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
dd50: 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
dd60: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
dd70: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
dd80: 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
dd90: 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
dda0: 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
ddb0: 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
ddc0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
ddd0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
dde0: 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
ddf0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
de00: 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20 20 20 20  urnal.  */.     
de10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
de20: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
de30: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
de40: 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
de50: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
de60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
de70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
de80: 4f 52 59 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  ORY .      );.  
de90: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
dea0: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
deb0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
dec0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
ded0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
dee0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
def0: 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
df00: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
df10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
df20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
df30: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71  ECK_PAGES.    sq
df40: 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
df50: 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
df60: 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
df70: 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65  et_pagehash);.#e
df80: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
df90: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
dfa0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
dfb0: 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
dfc0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
dfd0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
dfe0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
dff0: 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
e000: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
e010: 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28  if( pagerUseLog(
e020: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
e030: 63 32 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 57  c2 = sqlite3LogW
e040: 72 69 74 65 4c 6f 63 6b 28 70 50 61 67 65 72 2d  riteLock(pPager-
e050: 3e 70 4c 6f 67 2c 20 30 29 3b 0a 20 20 20 20 70  >pLog, 0);.    p
e060: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
e070: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
e080: 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
e090: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
e0a0: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55  ){.    rc2 = osU
e0b0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
e0c0: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
e0d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
e0e0: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
e0f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
e100: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
e110: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
e120: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
e130: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
e140: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
e150: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
e160: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
e170: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
e180: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
e190: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
e1a0: 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30  ->dbModified = 0
e1b0: 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73  ;..  /* TODO: Is
e1c0: 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57   this optimal? W
e1d0: 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a  hy is the db siz
e1e0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65  e invalidated he
e1f0: 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  re .  ** when th
e200: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e210: 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f  is not unlocked?
e220: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
e230: 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20  OrigSize = 0;.  
e240: 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
e250: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
e260: 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
e270: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d  bSize);.  if( !M
e280: 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
e290: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
e2a0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
e2b0: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
e2c0: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
e2d0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
e2e0: 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
e2f0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
e300: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
e310: 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
e320: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
e330: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
e340: 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
e350: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
e360: 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
e370: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
e380: 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
e390: 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
e3a0: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
e3b0: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
e3c0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
e3d0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
e3e0: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
e3f0: 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
e400: 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
e410: 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
e420: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
e430: 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
e440: 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
e450: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e460: 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
e470: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
e480: 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
e490: 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
e4a0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
e4b0: 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
e4c0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
e4d0: 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
e4e0: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
e4f0: 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
e500: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
e510: 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
e520: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
e530: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
e540: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
e550: 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
e560: 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
e570: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
e580: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
e590: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
e5a0: 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
e5b0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
e5c0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
e5d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
e5e0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
e5f0: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
e600: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
e610: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
e620: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
e630: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
e640: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
e650: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
e660: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
e670: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
e680: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
e690: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
e6a0: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
e6b0: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
e6c0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
e6d0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
e6e0: 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
e6f0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
e700: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
e710: 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
e720: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e730: 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
e740: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
e750: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
e760: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
e770: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
e780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
e790: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72  a single page fr
e7a0: 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f  om either the jo
e7b0: 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
e7c0: 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72  sMainJrnl==1) or
e7d0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62  .** from the sub
e7e0: 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d  -journal (if isM
e7f0: 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20  ainJrnl==0) and 
e800: 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61  playback that pa
e810: 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ge..** The page 
e820: 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74  begins at offset
e830: 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74   *pOffset into t
e840: 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f  he file. The *pO
e850: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
e860: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
e870: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
e880: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
e890: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
e8a0: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
e8b0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
e8c0: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
e8d0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
e8e0: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
e8f0: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
e900: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
e910: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
e920: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
e930: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
e940: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
e950: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
e960: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
e970: 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63   of the page rec
e980: 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ord read from th
e990: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
e9a0: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
e9b0: 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
e9c0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
e9d0: 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20  er.dbSize, then 
e9e0: 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73  playback is.** s
e9f0: 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54  kipped and SQLIT
ea00: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
ea10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65  ..**.** If pDone
ea20: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
ea30: 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72  en it is a recor
ea40: 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  d of pages that 
ea50: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20  have already.** 
ea60: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
ea70: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61  .  If the page a
ea80: 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61  t *pOffset has a
ea90: 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
eaa0: 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74  ed back.** (if t
eab0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
eac0: 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65   pDone bit is se
ead0: 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65  t) then skip the
eae0: 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61   playback..** Ma
eaf0: 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e  ke sure the pDon
eb00: 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
eb10: 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66  ing to the *pOff
eb20: 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a  set page is set.
eb30: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75  ** prior to retu
eb40: 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
eb50: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
eb60: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
eb70: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
eb80: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
eb90: 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62  .** and played b
eba0: 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ack, then SQLITE
ebb0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
ebc0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
ebd0: 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20  occurs.** while 
ebe0: 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f  reading the reco
ebf0: 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  rd from the (sub
ec00: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  -)journal file o
ec10: 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a  r while writing.
ec20: 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
ec30: 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
ec40: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
ec50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
ec60: 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65  data.** is succe
ec70: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
ec80: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
ec90: 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70  nal file but app
eca0: 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f  ears to be.** co
ecb0: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
ecc0: 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
ecd0: 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64  . Data is consid
ece0: 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69  ered corrupted i
ecf0: 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73  n.** two circums
ed00: 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20  tances:.** .**  
ed10: 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64   * If the record
ed20: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
ed30: 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41  illegal (0 or PA
ed40: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72  GER_MJ_PGNO), or
ed50: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
ed60: 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72  ecord is being r
ed70: 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  olled back from 
ed80: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
ed90: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64   file.**     and
eda0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69   the checksum fi
edb0: 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  eld does not mat
edc0: 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f  ch the record co
edd0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69  ntent..**.** Nei
ede0: 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77  ther of these tw
edf0: 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20  o scenarios are 
ee00: 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20  possible during 
ee10: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
ee20: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
ee30: 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69  his is a savepoi
ee40: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  nt rollback, the
ee50: 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76  n memory may hav
ee60: 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  e to be dynamica
ee70: 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  lly.** allocated
ee80: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
ee90: 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  n. If this is th
eea0: 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c  e case and an al
eeb0: 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a  location fails,.
eec0: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
eed0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
eee0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
eef0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
ef00: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
ef10: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
ef20: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
ef30: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
ef40: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66  ck */.  i64 *pOf
ef50: 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  fset,           
ef60: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
ef70: 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61  of record to pla
ef80: 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  yback */.  Bitve
ef90: 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20  c *pDone,       
efa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
efb0: 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
efc0: 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
efd0: 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
efe0: 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
eff0: 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
f000: 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
f010: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
f020: 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20  int isSavepnt   
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f040: 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65   True for a save
f050: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a  point rollback *
f060: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
f070: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f090: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
f0a0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
f0b0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
f0e0: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
f0f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
f100: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f120: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
f130: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
f140: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44  ng */.  char *aD
f150: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
f160: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
f170: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
f180: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
f190: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
f1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f1b0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
f1c0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
f1d0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
f1e0: 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  isSynced;       
f1f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
f200: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67  e if journal pag
f210: 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a  e is synced */..
f220: 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69    assert( (isMai
f230: 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20  nJrnl&~1)==0 ); 
f240: 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72       /* isMainJr
f250: 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nl is 0 or 1 */.
f260: 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76    assert( (isSav
f270: 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20  epnt&~1)==0 );  
f280: 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e       /* isSavepn
f290: 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  t is 0 or 1 */. 
f2a0: 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a   assert( isMainJ
f2b0: 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20  rnl || pDone ); 
f2c0: 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77      /* pDone alw
f2d0: 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d  ays used on sub-
f2e0: 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73  journals */.  as
f2f0: 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
f300: 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20  || pDone==0 );  
f310: 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20   /* pDone never 
f320: 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65  used on non-save
f330: 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74  point */..  aDat
f340: 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  a = pPager->pTmp
f350: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
f360: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
f370: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
f380: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
f390: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
f3a0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
f3b0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
f3c0: 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
f3d0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f3e0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
f3f0: 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
f400: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
f410: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
f420: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
f430: 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
f440: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
f450: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
f460: 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
f470: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
f480: 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
f490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
f4a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
f4b0: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
f4c0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
f4d0: 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
f4e0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
f4f0: 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
f500: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f510: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
f520: 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
f530: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
f540: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
f550: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
f560: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
f570: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
f580: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
f590: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
f5a0: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
f5b0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
f5c0: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
f5d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
f5e0: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
f5f0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
f600: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
f610: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
f620: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
f630: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
f640: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
f650: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
f660: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
f670: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
f680: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
f690: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
f6a0: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
f6b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
f6c0: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
f6d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f6e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
f6f0: 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
f700: 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
f710: 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
f720: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
f730: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f740: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
f750: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
f760: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
f770: 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
f780: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
f790: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
f7a0: 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
f7b0: 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
f7c0: 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
f7d0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
f7e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f7f0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
f800: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e  .  }..  if( pDon
f810: 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
f820: 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e  e3BitvecSet(pDon
f830: 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54  e, pgno))!=SQLIT
f840: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
f850: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  rn rc;.  }..  as
f860: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
f870: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
f880: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
f890: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
f8a0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
f8b0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
f8c0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
f8d0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
f8e0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
f8f0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
f900: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
f910: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
f920: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
f930: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
f940: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
f950: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
f960: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
f970: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
f980: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
f990: 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
f9a0: 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
f9b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
f9c0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
f9d0: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
f9e0: 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
f9f0: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
fa00: 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
fa10: 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
fa20: 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
fa30: 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
fa40: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
fa50: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
fa60: 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
fa70: 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
fa80: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
fa90: 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
faa0: 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
fab0: 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
fac0: 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
fad0: 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
fae0: 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
faf0: 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
fb00: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
fb10: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
fb20: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
fb30: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
fb40: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
fb50: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
fb60: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
fb70: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
fb80: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
fb90: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
fba0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
fbb0: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
fbc0: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
fbd0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
fbe0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
fbf0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
fc00: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
fc10: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
fc20: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
fc30: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
fc40: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
fc50: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
fc60: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
fc70: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
fc80: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
fc90: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
fca0: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
fcb0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
fcc0: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
fcd0: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
fce0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
fcf0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
fd00: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
fd10: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
fd20: 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65  ntents are synce
fd30: 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  d into the main 
fd40: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
fd50: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
fd60: 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  e, a power loss 
fd70: 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69  might leave modi
fd80: 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65  fied data in the
fd90: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
fda0: 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65  ile without an e
fdb0: 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ntry in the roll
fdc0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61  back journal tha
fdd0: 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f  t can.  ** resto
fde0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
fdf0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
fe00: 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69  form.  Two condi
fe10: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20  tions must be.  
fe20: 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  ** met before wr
fe30: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
fe40: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29  abase files. (1)
fe50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
fe60: 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65  st be.  ** locke
fe70: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
fe80: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
fe90: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  l page content i
fea0: 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20  s fully synced. 
feb0: 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   ** in the main 
fec0: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
fed0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
fee0: 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
fef0: 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65  or else.  ** the
ff00: 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
ff10: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
ff20: 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30    **.  ** 2008-0
ff30: 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65  4-14:  When atte
ff40: 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d  mpting to vacuum
ff50: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
ff60: 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a  ase file, it.  *
ff70: 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
ff80: 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e   fail a statemen
ff90: 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20  t on a database 
ffa0: 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65  that does not ye
ffb0: 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f  t exist..  ** Do
ffc0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
ffd0: 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73  write if databas
ffe0: 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72  e file has never
fff0: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20   been opened..  
10000 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
10010 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
10020 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
10030 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
10040 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
10050 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
10060 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
10070 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
10080 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
10090 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
100a0 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
100b0 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61  pageSize, (u8*)a
100c0 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
100d0 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
100e0 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
100f0 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
10100 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  ;.  if( isMainJr
10110 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63  nl ){.    isSync
10120 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ed = pPager->noS
10130 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74  ync || (*pOffset
10140 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
10150 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65  nalHdr);.  }else
10160 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
10170 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
10180 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
10190 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a  DR_NEED_SYNC));.
101a0 20 20 7d 0a 20 20 69 66 28 20 28 70 50 61 67 65    }.  if( (pPage
101b0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
101c0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26  EXCLUSIVE).   &&
101d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
101e0 66 64 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63  fd).   && isSync
101f0 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ed.  ){.    i64 
10200 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  ofst = (pgno-1)*
10210 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
10220 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63  eSize;.    testc
10230 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20  ase( !isSavepnt 
10240 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50  && pPg!=0 && (pP
10250 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
10260 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a  EED_SYNC)!=0 );.
10270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10280 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
10290 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
102a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
102b0 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
102c0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
102d0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
102e0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
102f0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
10300 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
10310 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20  r->pBackup ){.  
10320 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
10330 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
10340 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
10350 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EM);.      sqlit
10360 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
10370 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
10380 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
10390 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28  );.      CODEC2(
103a0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
103b0 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54  gno, 7, rc=SQLIT
103c0 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b  E_NOMEM, aData);
103d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
103e0 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
103f0 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
10400 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
10410 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
10420 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
10430 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
10440 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
10450 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
10460 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
10470 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
10480 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
10490 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
104a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
104b0 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
104c0 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
104d0 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
104e0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
104f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
10500 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
10510 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
10520 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
10530 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
10540 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
10550 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
10560 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
10570 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
10580 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
10590 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
105a0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
105b0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
105c0 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
105d0 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
105e0 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
105f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
10600 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
10610 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
10620 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
10630 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
10640 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
10650 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
10660 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
10670 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
10680 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
10690 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
106a0 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
106b0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
106c0 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
106d0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
106e0 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
106f0 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
10700 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
10710 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
10720 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
10730 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
10740 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
10750 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
10760 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
10770 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
10780 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71      if( (rc = sq
10790 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
107a0 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
107b0 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c 49 54  &pPg, 1))!=SQLIT
107c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
107d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
107e0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d     pPg->flags &=
107f0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
10800 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  D;.    sqlite3Pc
10810 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
10820 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  g);.  }.  if( pP
10830 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
10840 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
10850 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
10860 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
10870 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
10880 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
10890 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
108a0 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
108b0 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
108c0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
108d0 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
108e0 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
108f0 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
10900 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
10910 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
10920 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
10930 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
10940 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
10950 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
10960 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
10970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
10980 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
10990 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
109a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
109b0 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  a, (u8*)aData, p
109c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
109d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52  ;.    pPager->xR
109e0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
109f0 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
10a00 20 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20   && (!isSavepnt 
10a10 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61  || *pOffset<=pPa
10a20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
10a30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10a40 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
10a50 74 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a  this page were j
10a60 75 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ust restored fro
10a70 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20  m the main .    
10a80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
10a90 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74  e, then its cont
10aa0 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74  ent must be as t
10ab0 68 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68  hey were when th
10ac0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  e .      ** tran
10ad0 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73  saction was firs
10ae0 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  t opened. In thi
10af0 73 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61  s case we can ma
10b00 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rk the page.    
10b10 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73    ** as clean, s
10b20 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20  ince there will 
10b30 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72  be no need to wr
10b40 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
10b50 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
10b60 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ase..      **.  
10b70 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
10b80 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
10b90 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
10ba0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
10bb0 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
10bc0 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
10bd0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
10be0 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
10bf0 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
10c00 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
10c10 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
10c20 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
10c30 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
10c40 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
10c50 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
10c60 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
10c70 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
10c80 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
10c90 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
10ca0 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
10cb0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
10cc0 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
10cd0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
10ce0 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
10cf0 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
10d00 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
10d10 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
10d20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
10d30 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
10d40 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
10d50 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
10d60 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
10d70 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
10d80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
10d90 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
10da0 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
10db0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
10dc0 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
10dd0 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
10de0 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
10df0 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
10e00 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
10e10 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
10e20 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
10e30 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
10e40 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
10e50 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
10e60 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
10e70 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
10e80 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
10e90 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
10ea0 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
10eb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
10ec0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
10ed0 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
10ee0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
10ef0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
10f00 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
10f10 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
10f20 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
10f30 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
10f40 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
10f50 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
10f60 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
10f70 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
10f80 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
10f90 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
10fa0 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
10fb0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
10fc0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
10fd0 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
10fe0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
10ff0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
11000 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
11010 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
11020 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
11030 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
11040 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
11050 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
11060 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
11070 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
11080 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
11090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
110a0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
110b0 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
110c0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
110d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
110e0 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
110f0 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
11100 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
11110 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
11120 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
11130 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
11140 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11150 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
11160 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
11170 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11180 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
11190 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
111a0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
111b0 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
111c0 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
111d0 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
111e0 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
111f0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
11200 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
11210 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
11220 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
11230 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
11240 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
11250 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
11260 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
11270 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
11280 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
11290 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
112a0 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
112b0 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
112c0 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
112d0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
112e0 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
112f0 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
11300 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
11310 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
11320 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
11330 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
11340 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
11350 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
11360 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
11370 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
11380 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
11390 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
113a0 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
113b0 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
113c0 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
113d0 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
113e0 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
113f0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
11400 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
11410 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
11420 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
11430 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
11440 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11450 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
11460 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
11470 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
11480 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
11490 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
114a0 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
114b0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
114c0 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
114d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
114e0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
114f0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
11500 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
11510 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
11520 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
11530 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
11540 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
11550 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
11560 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
11570 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
11580 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
11590 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
115a0 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
115b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
115c0 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
115d0 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
115e0 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
115f0 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
11600 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
11610 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
11620 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
11630 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11640 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
11650 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
11660 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
11670 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
11680 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
11690 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
116a0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
116b0 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
116c0 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
116d0 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
116e0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
116f0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
11700 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
11710 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
11720 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
11730 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
11740 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
11750 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
11760 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
11770 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
11780 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
11790 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
117a0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
117b0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
117c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
117d0 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
117e0 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
117f0 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
11800 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
11810 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
11820 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
11830 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
11840 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
11850 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
11860 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
11870 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
11880 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
11890 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
118a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
118b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
118c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
118d0 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
118e0 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
118f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
11900 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
11910 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
11920 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
11930 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
11940 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11950 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
11960 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
11970 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
11980 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11990 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
119a0 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
119b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
119c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
119d0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
119e0 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
119f0 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
11a00 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
11a10 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
11a20 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11a30 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
11a40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
11a50 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
11a60 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
11a70 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
11a80 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
11a90 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
11aa0 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
11ab0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
11ac0 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
11ad0 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
11ae0 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
11af0 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
11b00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
11b10 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
11b20 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
11b30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11b40 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
11b50 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
11b60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11b70 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
11b80 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
11b90 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
11ba0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11bb0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
11bc0 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71  _out;..  rc = sq
11bd0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
11be0 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
11bf0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
11c00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11c10 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11c20 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
11c30 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
11c40 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
11c50 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
11c60 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20  asterPtr = 0;.  
11c70 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
11c80 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
11c90 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
11ca0 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
11cb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11cc0 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
11cd0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
11ce0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
11cf0 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
11d00 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
11d10 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
11d20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
11d30 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
11d40 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
11d50 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
11d60 72 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  r + 1);.    if( 
11d70 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
11d80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11d90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11da0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
11db0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
11dc0 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
11dd0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
11de0 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
11df0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11e00 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
11e10 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
11e20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
11e30 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
11e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11e50 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11e60 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  out;.    zMaster
11e70 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
11e80 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
11e90 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
11ea0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
11eb0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
11ec0 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
11ed0 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
11ee0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
11ef0 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
11f00 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
11f10 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
11f20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
11f30 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
11f40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11f60 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
11f70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
11f80 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
11f90 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
11fa0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
11fb0 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
11fc0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11fd0 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
11fe0 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
11ff0 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
12000 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
12010 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
12020 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
12030 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
12040 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
12050 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
12060 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12070 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
12080 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
12090 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
120a0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
120b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
120c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
120d0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
120e0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
120f0 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
12100 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
12110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12120 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
12130 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
12140 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
12150 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
12160 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
12170 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
12180 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
12190 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
121a0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
121b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
121c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
121d0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
121e0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
121f0 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
12200 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
12210 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
12220 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
12230 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
12240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
12250 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
12260 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
12270 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12280 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
12290 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
122a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
122b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
122c0 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
122d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
122e0 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
122f0 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
12300 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
12310 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
12320 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
12330 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
12340 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
12350 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
12360 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
12370 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
12380 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
12390 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
123a0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
123b0 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
123c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
123d0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
123e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
123f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12400 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
12410 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
12420 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
12430 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
12440 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
12450 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
12460 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
12470 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
12480 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
12490 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
124a0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
124b0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
124c0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
124d0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
124e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
124f0 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63   open, or an exc
12500 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e  lusive lock is n
12510 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73  ot.** held, this
12520 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
12530 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
12540 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12550 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e   file is.** chan
12560 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
12570 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
12580 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
12590 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
125a0 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  * on disk is cur
125b0 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
125c0 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
125d0 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
125e0 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
125f0 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
12600 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
12610 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
12620 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
12630 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
12640 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
12650 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
12660 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
12670 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
12680 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
12690 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
126a0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
126b0 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
126c0 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
126d0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
126e0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
126f0 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
12700 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
12710 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
12720 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
12730 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
12740 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
12750 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
12760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12770 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
12780 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
12790 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
127a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
127b0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
127c0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
127d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
127e0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
127f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
12800 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
12810 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12820 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12830 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
12840 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e  LUSIVE && isOpen
12850 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
12860 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
12870 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
12880 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
12890 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
128a0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
128b0 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
128c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
128d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
128e0 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
128f0 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
12900 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
12910 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
12920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12930 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
12940 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
12950 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
12960 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
12970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12980 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
12990 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
129a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
129b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
129c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
129d0 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
129e0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
129f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12a10 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
12a20 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
12a30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12a50 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
12a60 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
12a70 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
12a80 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
12a90 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
12aa0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
12ab0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
12ac0 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
12ad0 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
12ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12af0 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
12b00 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
12b10 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
12b20 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
12b30 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
12b40 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
12b50 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
12b60 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
12b70 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
12b80 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
12b90 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
12ba0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
12bb0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
12bc0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
12bd0 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
12be0 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
12bf0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
12c00 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
12c10 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
12c20 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
12c30 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
12c40 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
12c50 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
12c60 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
12c70 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
12c80 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
12c90 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
12ca0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
12cb0 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
12cc0 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ZE..*/.static vo
12cd0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
12ce0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12cf0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
12d00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
12d10 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
12d20 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  e );..  if( !pPa
12d30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
12d40 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
12d50 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
12d60 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
12d70 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
12d80 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
12d90 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
12da0 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
12db0 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
12dc0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
12dd0 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
12de0 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  gfault..    */. 
12df0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
12e00 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
12e10 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
12e20 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69  er->fd);.  }.  i
12e30 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
12e40 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20  rSize<32 ){.    
12e50 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12e60 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
12e70 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12e80 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
12e90 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
12ea0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
12eb0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
12ec0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
12ed0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
12ee0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
12ef0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
12f00 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
12f10 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
12f20 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
12f30 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
12f40 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
12f50 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
12f60 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
12f70 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12f80 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
12f90 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
12fa0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
12fb0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
12fc0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
12fd0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
12fe0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12ff0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
13000 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
13010 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
13020 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
13030 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
13040 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
13050 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
13060 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
13070 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
13080 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
13090 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
130a0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
130b0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
130c0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
130d0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
130e0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
130f0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
13100 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
13110 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
13120 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
13130 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
13140 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
13150 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
13160 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
13170 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
13180 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
13190 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
131a0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
131b0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
131c0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
131d0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
131e0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
131f0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13200 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
13210 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
13220 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
13230 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
13240 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
13250 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
13260 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
13270 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
13280 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
13290 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
132a0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
132b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
132c0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
132d0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
132e0 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
132f0 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
13300 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
13310 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
13320 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
13330 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
13340 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
13350 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
13360 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
13370 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
13380 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
13390 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
133a0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
133b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
133c0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
133d0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
133e0 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
133f0 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
13400 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
13410 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
13420 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
13430 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
13440 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
13450 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
13460 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
13470 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
13480 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
13490 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
134a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
134b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
134c0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
134d0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
134e0 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
134f0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
13500 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
13510 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
13520 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
13530 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
13540 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
13550 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
13560 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
13570 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
13580 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
13590 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
135a0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
135b0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
135c0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
135d0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
135e0 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
135f0 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
13600 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
13610 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
13620 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
13630 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
13640 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
13650 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
13660 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
13670 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
13680 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
13690 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
136a0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
136b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
136c0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
136d0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
136e0 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
136f0 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
13700 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
13710 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
13720 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
13730 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
13740 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
13750 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
13760 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
13770 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
13780 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
13790 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
137a0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
137b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
137c0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
137d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
137e0 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
137f0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
13800 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
13810 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
13820 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
13830 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
13840 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
13850 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
13860 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
13870 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
13880 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
13890 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
138a0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
138b0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
138c0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
138d0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
138e0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
138f0 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
13900 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
13910 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
13920 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
13930 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
13940 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
13950 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
13960 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
13970 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
13980 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
13990 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
139a0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
139b0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
139c0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
139d0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
139e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
139f0 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
13a00 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
13a10 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
13a20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
13a30 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
13a40 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
13a50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13a60 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
13a70 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a90 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
13aa0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
13ab0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
13ae0 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
13af0 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
13b20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
13b30 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
13b40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13b50 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
13b60 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
13b70 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13b90 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
13ba0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
13bb0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
13bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
13bd0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
13be0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
13bf0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
13c00 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
13c10 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
13c20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
13c30 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
13c40 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
13c50 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
13c60 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
13c70 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
13c80 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
13c90 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
13ca0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
13cb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
13cc0 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
13cd0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
13ce0 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
13cf0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
13d00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
13d10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13d20 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13d30 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
13d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13d50 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
13d60 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
13d70 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
13d80 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
13d90 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
13da0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
13db0 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
13dc0 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
13dd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
13de0 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
13df0 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
13e00 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
13e10 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
13e20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
13e30 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
13e40 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
13e50 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
13e60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
13e70 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
13e80 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
13e90 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
13ea0 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
13eb0 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
13ec0 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
13ed0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
13ee0 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
13ef0 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
13f00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
13f10 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
13f20 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
13f30 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
13f40 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
13f50 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
13f60 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
13f70 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
13f80 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
13f90 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
13fa0 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
13fb0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
13fc0 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
13fd0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
13fe0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
13ff0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
14000 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
14010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14020 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
14030 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14040 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
14050 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
14060 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
14070 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
14080 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
14090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
140a0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
140b0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
140c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
140d0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
140e0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
140f0 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
14100 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
14110 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
14120 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
14130 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
14140 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
14150 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
14160 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
14170 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
14180 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
14190 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
141a0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
141b0 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
141c0 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
141d0 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
141e0 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
141f0 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
14200 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
14210 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
14220 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
14230 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
14240 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
14250 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
14260 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
14270 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
14280 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
14290 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
142a0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
142b0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
142c0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
142d0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
142e0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
142f0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
14300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14310 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
14320 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
14330 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14340 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
14350 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
14360 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
14370 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
14380 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
14390 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
143a0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
143b0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
143c0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
143d0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
143e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
143f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
14400 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
14410 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
14420 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
14430 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
14440 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
14450 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
14460 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
14470 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
14480 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
14490 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
144a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
144b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
144c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
144d0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
144e0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
144f0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
14500 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
14510 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14520 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
14530 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
14540 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
14550 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
14560 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
14570 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
14580 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
14590 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
145a0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
145b0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
145c0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
145d0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
145e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
145f0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
14600 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
14610 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
14620 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
14630 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
14640 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
14650 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
14660 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
14670 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
14680 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
14690 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
146a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
146b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
146c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
146d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
146e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
146f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
14700 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
14710 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
14720 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
14730 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
14740 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
14750 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
14760 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
14770 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
14780 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
14790 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
147a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
147b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
147c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
147d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
147e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
147f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
14800 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
14810 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
14820 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
14830 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
14840 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
14850 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
14860 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
14870 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
14880 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
14890 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
148a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
148b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
148c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
148d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
148e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
148f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
14900 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
14910 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
14920 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
14930 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
14940 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
14950 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
14960 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
14970 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
14980 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
14990 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
149a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
149b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
149c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
149d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
149e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
149f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
14a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a10 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
14a20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
14a30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
14a40 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
14a50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
14a60 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
14a70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
14a80 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
14a90 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
14aa0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
14ab0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
14ac0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
14ad0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
14ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
14af0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
14b00 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
14b10 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
14b20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
14b30 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
14b40 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
14b50 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
14b60 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
14b70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
14b80 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
14b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14ba0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
14bb0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
14bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14be0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14bf0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
14c00 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14c10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
14c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
14c30 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
14c40 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
14c50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
14c60 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
14c70 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
14c80 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
14c90 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
14ca0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
14cb0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
14cc0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
14cd0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
14ce0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
14cf0 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
14d00 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
14d10 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
14d20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
14d30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
14d40 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
14d50 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
14d60 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
14d70 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
14d80 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
14d90 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
14da0 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
14db0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14dc0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
14dd0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14de0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
14df0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
14e00 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
14e10 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
14e20 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
14e30 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
14e40 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
14e50 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
14e60 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
14e70 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
14e80 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
14e90 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
14ea0 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
14eb0 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
14ec0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
14ed0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
14ee0 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
14ef0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
14f00 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
14f10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
14f20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
14f30 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
14f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14f50 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
14f60 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
14f70 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
14f80 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
14f90 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
14fa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
14fb0 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
14fc0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
14fd0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
14fe0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
14ff0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
15000 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
15010 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
15020 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
15030 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
15040 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
15050 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
15060 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
15070 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
15080 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
15090 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50 61   assert(.    pPa
150a0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
150b0 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69  s==0 ||.    sqli
150c0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
150d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
150e0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
150f0 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45  ANGED,0)>=SQLITE
15100 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49  _OK.  );..  /* I
15110 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
15120 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
15130 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
15140 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
15150 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
15160 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
15170 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
15180 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
15190 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
151a0 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
151b0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
151c0 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
151d0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
151e0 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
151f0 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
15200 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
15210 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
15220 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
15230 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
15240 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
15250 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
15260 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
15270 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
15280 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
15290 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
152a0 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
152b0 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
152c0 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
152d0 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
152e0 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
152f0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
15300 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
15310 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
15320 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
15330 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
15340 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
15350 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
15360 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
15370 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
15380 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
15390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
153a0 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
153b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
153c0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
153d0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
153e0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
153f0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
15400 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
15410 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
15420 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
15430 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15440 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
15450 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  noSync==0 && pPa
15460 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
15470 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
15480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15490 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
154a0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
154b0 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lags);.  }.  if(
154c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
154d0 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
154e0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
154f0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
15500 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
15510 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15520 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
15530 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
15540 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
15550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15560 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
15570 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
15580 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
15590 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61  \0');.    testca
155a0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
155b0 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
155c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
155d0 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
155e0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
155f0 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
15600 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
15610 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15620 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
15630 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
15640 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
15650 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
15660 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
15670 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
15680 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
15690 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
156a0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
156b0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
156c0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
156d0 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
156e0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
156f0 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
15700 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
15710 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
15720 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
15730 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
15740 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
15750 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
15760 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
15770 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
15780 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
15790 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
157a0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
157b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
157c0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
157d0 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
157e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
157f0 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
15800 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
15810 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
15820 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
15830 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
15840 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
15850 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
15860 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
15870 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
15880 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
15890 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
158a0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
158b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
158c0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
158d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
158e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
158f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
15900 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
15910 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
15920 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
15930 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
15940 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
15950 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
15960 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
15970 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
15980 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
15990 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
159a0 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
159b0 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
159c0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
159d0 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
159e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
159f0 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
15a00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
15a10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15a20 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69   code */.  i64 i
15a30 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
15a40 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
15a50 6f 66 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74  offset of file t
15a60 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
15a70 20 69 6e 74 20 69 73 49 6e 4c 6f 67 20 3d 20 30   int isInLog = 0
15a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15a90 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
15aa0 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
15ab0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15ac0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
15ad0 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42  SHARED && !MEMDB
15ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
15af0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
15b00 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
15b10 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
15b20 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73  >fd)) ){.    ass
15b30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
15b40 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d  pFile );.    mem
15b50 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
15b60 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
15b70 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ize);.    return
15b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15b90 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 4c  .  if( pagerUseL
15ba0 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  og(pPager) ){.  
15bb0 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c    /* Try to pull
15bc0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
15bd0 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c  he write-ahead l
15be0 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  og. */.    rc = 
15bf0 73 71 6c 69 74 65 33 4c 6f 67 52 65 61 64 28 70  sqlite3LogRead(p
15c00 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 67 6e  Pager->pLog, pgn
15c10 6f 2c 20 26 69 73 49 6e 4c 6f 67 2c 20 70 50 67  o, &isInLog, pPg
15c20 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
15c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15c40 4b 20 26 26 20 21 69 73 49 6e 4c 6f 67 20 29 7b  K && !isInLog ){
15c50 0a 20 20 20 20 69 4f 66 66 73 65 74 20 3d 20 28  .    iOffset = (
15c60 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
15c70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
15c80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15c90 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
15ca0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
15cb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
15cc0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
15cd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
15ce0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
15cf0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15d00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
15d10 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
15d20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
15d30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
15d40 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
15d50 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
15d60 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
15d70 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
15d80 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
15d90 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
15da0 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
15db0 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
15dc0 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
15dd0 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
15de0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
15df0 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
15e00 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
15e10 20 20 2a 2a 20 7a 65 72 6f 2e 20 20 42 79 74 65    ** zero.  Byte
15e20 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
15e30 2e 33 39 20 73 68 6f 75 6c 64 20 62 65 20 70 61  .39 should be pa
15e40 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
15e50 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65   are.      ** ne
15e60 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
15e70 20 53 6f 20 66 69 6c 6c 69 6e 67 20 70 50 61 67   So filling pPag
15e80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
15e90 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 0a 20   with all 0xff. 
15ea0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 73 68       ** bytes sh
15eb0 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
15ec0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
15ed0 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
15ee0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
15ef0 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
15f00 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
15f10 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
15f20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15f30 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
15f40 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
15f50 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
15f60 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67  ** white noising
15f70 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
15f80 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
15f90 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
15fa0 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
15fb0 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
15fc0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
15fd0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
15fe0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
15ff0 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
16000 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
16010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16020 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
16030 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
16040 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
16050 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
16060 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
16070 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
16080 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
16090 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
160a0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
160b0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
160c0 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
160d0 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45  _NOMEM);..  PAGE
160e0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
160f0 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
16100 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
16110 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
16120 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
16130 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
16140 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41  er, pgno));.  PA
16150 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
16160 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
16170 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
16180 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
16190 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
161a0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
161b0 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  pPg)));..  retur
161c0 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
161d0 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  int pagerRollbac
161e0 6b 4c 6f 67 28 50 61 67 65 72 20 2a 70 50 61 67  kLog(Pager *pPag
161f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
16200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
16210 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
16220 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
16230 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
16240 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  he);.  pPager->d
16250 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
16260 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 77 68  dbOrigSize;.  wh
16270 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
16280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16290 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
162a0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
162b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
162c0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
162d0 6e 74 28 70 4c 69 73 74 29 3d 3d 30 20 29 7b 0a  nt(pList)==0 ){.
162e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
162f0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
16300 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
16310 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
16320 68 65 44 72 6f 70 28 70 4c 69 73 74 29 3b 0a 20  heDrop(pList);. 
16330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16340 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
16350 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
16360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16370 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
16380 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 4c 69  r->xReiniter(pLi
16390 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
163a0 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70   }.    pList = p
163b0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
163c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
163d0 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
163e0 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
163f0 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
16400 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
16410 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
16420 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
16430 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
16440 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
16450 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
16460 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
16470 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
16480 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
16490 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
164a0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
164b0 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
164c0 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
164d0 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
164e0 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
164f0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
16500 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
16510 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
16520 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
16530 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
16540 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
16550 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
16560 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
16570 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
16580 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
16590 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
165a0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
165b0 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
165c0 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
165d0 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
165e0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
165f0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
16600 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
16610 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
16620 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
16630 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
16640 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
16650 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
16660 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
16670 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
16680 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
16690 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
166a0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
166b0 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
166c0 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
166d0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
166e0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
166f0 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
16700 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
16710 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
16720 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
16730 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
16740 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
16750 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
16760 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
16770 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
16780 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
16790 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
167a0 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
167b0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
167c0 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
167d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
167e0 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
167f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
16800 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
16810 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
16820 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
16830 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
16840 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
16850 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
16860 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
16870 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
16880 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
16890 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
168a0 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
168b0 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
168c0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
168d0 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
168e0 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
168f0 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
16900 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
16910 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
16920 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
16930 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
16940 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
16950 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
16960 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
16970 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
16980 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
16990 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
169a0 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
169b0 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
169c0 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
169d0 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
169e0 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
169f0 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
16a00 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
16a10 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
16a20 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
16a30 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
16a40 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
16a50 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
16a60 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
16a70 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
16a80 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
16a90 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
16aa0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
16ab0 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
16ac0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
16ad0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
16ae0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
16af0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
16b00 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
16b10 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
16b20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
16b30 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
16b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
16b50 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
16b60 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
16b70 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
16b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16b90 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
16ba0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
16bb0 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
16bc0 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
16bd0 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
16be0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
16bf0 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
16c00 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16c10 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
16c20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
16c30 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
16c40 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
16c50 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
16c60 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
16c70 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
16c80 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
16c90 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
16ca0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
16cb0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
16cc0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
16cd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
16ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16cf0 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
16d00 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
16d10 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
16d20 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
16d30 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
16d40 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
16d50 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
16d60 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
16d70 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
16d80 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
16d90 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
16da0 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
16db0 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
16dc0 4c 6f 67 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Log(pPager) ){. 
16dd0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
16de0 6f 6c 6c 62 61 63 6b 4c 6f 67 28 70 50 61 67 65  ollbackLog(pPage
16df0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
16e00 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
16e10 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
16e20 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
16e30 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
16e40 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
16e50 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
16e60 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
16e70 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
16e80 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
16e90 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
16ea0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
16eb0 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
16ec0 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
16ed0 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
16ee0 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
16ef0 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
16f00 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
16f10 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
16f20 65 72 74 28 20 70 61 67 65 72 55 73 65 4c 6f 67  ert( pagerUseLog
16f30 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
16f40 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
16f50 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
16f60 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
16f70 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
16f80 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
16f90 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
16fa0 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
16fb0 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
16fc0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
16fd0 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
16fe0 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
16ff0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
17000 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
17010 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
17020 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
17030 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
17040 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
17050 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
17060 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
17070 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
17080 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
17090 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
170a0 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
170b0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
170c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
170d0 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
170e0 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20 29  UseLog(pPager) )
170f0 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
17100 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
17110 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
17120 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
17130 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
17140 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
17150 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
17160 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
17170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17180 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17190 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
171a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
171b0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
171c0 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
171d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
171e0 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
171f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
17200 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
17210 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17220 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17230 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
17240 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
17250 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
17260 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
17270 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
17280 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
17290 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
172a0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
172b0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
172c0 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
172d0 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
172e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
172f0 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
17300 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
17310 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
17320 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
17330 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
17340 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
17350 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
17360 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
17370 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
17380 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
17390 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
173a0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
173b0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
173c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
173d0 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
173e0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
173f0 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
17400 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
17410 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
17420 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
17430 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
17440 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
17450 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
17460 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
17470 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
17480 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
17490 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
174a0 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
174b0 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
174c0 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
174d0 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
174e0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
174f0 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
17500 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
17510 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
17520 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
17530 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
17540 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
17550 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
17560 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
17570 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
17580 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
17590 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
175a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
175b0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
175c0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
175d0 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
175e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
175f0 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
17600 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
17610 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
17620 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
17630 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
17640 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
17650 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
17660 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
17670 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
17680 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
17690 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
176a0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
176b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
176c0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
176d0 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
176e0 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
176f0 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
17700 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
17710 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
17720 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
17730 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
17740 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
17750 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
17760 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
17770 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
17780 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
17790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
177a0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
177b0 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
177c0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
177d0 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
177e0 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
177f0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
17800 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17810 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
17820 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
17830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17840 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
17850 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
17860 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
17870 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
17880 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
17890 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
178a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
178b0 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c  pPager, &offset,
178c0 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20   pDone, 0, 1);. 
178d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
178e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
178f0 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
17900 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
17910 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
17920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17930 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
17940 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
17950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17960 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17970 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
17980 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
17990 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
179a0 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
179b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
179c0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
179d0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
179e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
179f0 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
17a00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
17a10 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
17a20 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
17a30 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
17a40 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
17a50 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
17a60 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
17a70 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
17a80 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
17a90 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
17aa0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
17ab0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
17ac0 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
17ad0 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
17ae0 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
17af0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
17b00 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
17b10 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
17b20 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
17b30 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
17b40 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
17b50 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
17b60 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
17b70 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
17b80 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
17b90 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
17ba0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17bb0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
17bc0 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
17bd0 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
17be0 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
17bf0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
17c00 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
17c10 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
17c20 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
17c30 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
17c40 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
17c50 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
17c60 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
17c70 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
17c80 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
17c90 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
17ca0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
17cb0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
17cc0 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
17cd0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
17ce0 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
17cf0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
17d00 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
17d10 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
17d20 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
17d30 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
17d40 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
17d50 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
17d60 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
17d70 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
17d80 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
17d90 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
17da0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
17db0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
17dd0 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
17de0 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
17df0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
17e00 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
17e10 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
17e20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
17e30 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
17e40 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
17e50 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
17e60 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
17e70 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
17e80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
17e90 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
17ea0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
17eb0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
17ec0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
17ed0 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
17ee0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17ef0 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
17f00 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
17f10 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
17f20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
17f30 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
17f40 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
17f50 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
17f60 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
17f70 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
17f80 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a  nt bFullFsync){.
17f90 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
17fa0 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
17fb0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
17fc0 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
17fd0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
17fe0 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
17ff0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
18000 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :0;.  pPager->sy
18010 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
18020 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
18030 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
18040 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
18050 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
18060 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
18070 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
18080 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
18090 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
180a0 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
180b0 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
180c0 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
180d0 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
180e0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
180f0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
18100 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
18110 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
18120 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
18130 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
18140 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
18150 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
18160 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
18170 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
18180 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
18190 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
181a0 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
181b0 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
181c0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
181d0 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
181e0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
181f0 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
18200 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
18210 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
18220 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
18230 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
18240 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
18250 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
18260 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
18270 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
18280 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
18290 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
182a0 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
182b0 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
182c0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
182d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
182e0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
182f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
18300 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
18310 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
18320 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
18330 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
18340 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
18350 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
18360 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
18370 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
18380 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
18390 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
183a0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
183b0 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
183c0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
183d0 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
183e0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
183f0 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
18400 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18420 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
18430 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18440 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
18450 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
18460 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
18470 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
18480 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
18490 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
184a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
184b0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
184c0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
184d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
184e0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
184f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
18500 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
18510 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
18520 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
18530 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
18540 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
18550 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
18560 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
18570 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18580 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
18590 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
185a0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
185b0 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
185c0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
185d0 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
185e0 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
185f0 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
18600 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
18610 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
18620 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
18630 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
18640 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
18650 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
18660 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
18670 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
18680 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
18690 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
186a0 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
186b0 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
186c0 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
186d0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
186e0 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
186f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
18700 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
18710 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
18720 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
18730 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
18740 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
18750 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
18760 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
18770 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
18780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
187a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
187b0 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
187c0 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
187d0 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
187e0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
187f0 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
18800 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
18810 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
18820 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
18830 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
18840 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
18850 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
18860 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
18870 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
18880 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
18890 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
188a0 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
188b0 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
188c0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
188d0 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
188e0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
188f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
18900 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
18910 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
18920 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
18930 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
18940 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18960 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
18970 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
18980 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
18990 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
189a0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
189b0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
189c0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
189d0 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
189e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
189f0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
18a00 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
18a10 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d  /.){  .  pPager-
18a20 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
18a30 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
18a40 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
18a50 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
18a60 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a  andlerArg;.}../*
18a70 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
18a80 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
18a90 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
18aa0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
18ab0 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
18ac0 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
18ad0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
18ae0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
18af0 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
18b00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
18b10 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
18b20 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
18b30 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
18b40 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
18b50 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
18b60 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
18b90 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
18ba0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18bb0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
18bc0 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
18bd0 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
18be0 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
18bf0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
18c00 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
18c10 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
18c20 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
18c30 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
18c40 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
18c50 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
18c60 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
18c70 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
18c80 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
18c90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
18ca0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
18cb0 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
18cc0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
18cd0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
18ce0 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
18cf0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
18d00 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
18d10 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  UPT or SQLITE_FU
18d20 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
18d30 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
18d40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
18d50 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
18d60 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
18d70 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
18d80 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
18d90 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
18da0 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
18db0 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
18dc0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
18dd0 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
18de0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
18df0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
18e00 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
18e10 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
18e20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
18e30 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
18e40 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
18e50 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
18e60 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
18e70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
18e80 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
18e90 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
18ea0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
18eb0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
18ec0 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
18ed0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
18ee0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
18ef0 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
18f00 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
18f10 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
18f20 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
18f30 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
18f40 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
18f50 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
18f60 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
18f70 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
18f80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
18f90 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
18fa0 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
18fb0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
18fc0 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
18fd0 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
18fe0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
18ff0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
19000 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
19010 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
19020 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
19030 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
19040 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
19050 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
19060 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
19070 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
19080 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
19090 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
190a0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
190b0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
190c0 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
190d0 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
190e0 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
190f0 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
19100 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
19110 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
19120 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
19130 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
19140 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a  r, u16 *pPageSiz
19150 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
19160 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61  {.  int rc = pPa
19170 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
19180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19190 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61  OK ){.    u16 pa
191a0 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
191b0 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
191c0 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
191d0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
191e0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
191f0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
19200 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50  ) );.    if( (pP
19210 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
19220 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
19230 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c  ==0).     && sql
19240 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
19250 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
19260 68 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  he)==0 .     && 
19270 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
19280 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61  Size!=pPager->pa
19290 67 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20  geSize .    ){. 
192a0 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
192b0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
192c0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
192d0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
192e0 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
192f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19300 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
19310 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
19320 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
19330 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
19340 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
19350 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ze;.        sqli
19360 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
19370 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
19380 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19390 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
193a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
193b0 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
193c0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
193d0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
193e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
193f0 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75   *pPageSize = (u
19400 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  16)pPager->pageS
19410 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ize;.    if( nRe
19420 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
19430 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
19440 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
19450 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
19460 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
19470 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
19480 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
19490 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
194a0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
194b0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
194c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
194d0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
194e0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
194f0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
19500 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
19510 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
19520 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
19530 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
19540 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
19550 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
19560 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
19570 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
19580 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
19590 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
195a0 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
195b0 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
195c0 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
195d0 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
195e0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
195f0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
19600 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
19610 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
19620 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
19630 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
19640 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
19650 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
19660 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
19670 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
19680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
19690 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
196a0 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
196b0 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
196c0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
196d0 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
196e0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
196f0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
19700 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
19710 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
19720 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
19730 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
19740 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
19750 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
19760 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
19770 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
19780 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
19790 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
197a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
197b0 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
197c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
197d0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61  Page){.  int nPa
197e0 67 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  ge;.  if( mxPage
197f0 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
19800 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
19810 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
19820 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19830 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
19840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19850 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61 67 65 20  ->mxPgno>=nPage 
19860 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
19870 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
19880 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
19890 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
198a0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
198b0 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
198c0 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
198d0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
198e0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
198f0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
19900 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
19910 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
19920 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
19930 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
19940 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
19950 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
19960 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
19970 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
19980 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
19990 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
199a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
199b0 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
199c0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
199d0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
199e0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
199f0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
19a00 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
19a10 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
19a20 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
19a30 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
19a40 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
19a50 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
19a60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
19a70 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
19a80 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
19a90 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
19aa0 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
19ab0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
19ac0 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
19ad0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
19ae0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
19af0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
19b00 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
19b10 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
19b20 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
19b30 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
19b40 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
19b50 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
19b60 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
19b70 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
19b80 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
19b90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
19ba0 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
19bb0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
19bc0 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
19bd0 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
19be0 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
19bf0 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
19c00 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
19c10 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
19c20 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
19c30 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
19c40 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
19c50 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
19c60 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
19c70 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
19c80 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
19c90 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
19ca0 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
19cb0 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
19cc0 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
19cd0 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
19ce0 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
19cf0 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
19d00 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
19d10 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
19d20 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
19d30 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
19d40 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
19d50 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
19d60 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
19d70 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
19d80 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
19d90 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
19da0 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
19db0 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
19dc0 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
19dd0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
19de0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
19df0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
19e00 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
19e10 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
19e20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
19e30 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
19e40 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  e );.  if( isOpe
19e50 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
19e60 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
19e70 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
19e80 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
19e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
19ea0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
19eb0 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
19ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19ed0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
19ee0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
19ef0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19f00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19f20 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
19f30 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
19f40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19f50 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
19f60 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72  with pPager. Nor
19f70 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63  mally, this is c
19f80 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64  alculated as (<d
19f90 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61  b file size>/<pa
19fa0 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f  ge-size>)..** Ho
19fb0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
19fc0 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
19fd0 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
19fe0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
19ff0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
1a000 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
1a010 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  age file..**.** 
1a020 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1a030 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
1a040 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1a050 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
1a060 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73  n the.** error s
1a070 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
1a080 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1a090 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63  *pnPage left unc
1a0a0 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69  hanged. Or,.** i
1a0b0 66 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  f the file syste
1a0c0 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75 65 72  m has to be quer
1a0d0 69 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65  ied for the size
1a0e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
1a0f0 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61 74  .** the query at
1a100 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e  tempt returns an
1a110 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49   IO error, the I
1a120 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1a130 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
1a140 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
1a150 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
1a160 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
1a170 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
1a180 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51  cessful, then SQ
1a190 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1a1a0 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
1a1b0 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
1a1c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1a1d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1a1e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a1f0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
1a200 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1a210 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  t *pnPage){.  Pg
1a220 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20  no nPage = 0;   
1a230 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1a240 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1a250 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1a260 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75  Determine the nu
1a270 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1a280 20 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65   the file. Store
1a290 20 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20   this in nPage. 
1a2a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1a2b0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a  >dbSizeValid ){.
1a2c0 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
1a2d0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65  er->dbSize;.  }e
1a2e0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e   /* Error return
1a310 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65  ed by OsFileSize
1a320 28 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20  () */.    i64 n 
1a330 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a340 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69    /* File size i
1a350 6e 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64  n bytes returned
1a360 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29   by OsFileSize()
1a370 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 61 67   */..    if( pag
1a380 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29  erUseLog(pPager)
1a390 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a3a0 33 4c 6f 67 4d 61 78 70 67 6e 6f 28 70 50 61 67  3LogMaxpgno(pPag
1a3b0 65 72 2d 3e 70 4c 6f 67 2c 20 26 6e 50 61 67 65  er->pLog, &nPage
1a3c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1a3d0 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
1a3e0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1a3f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1a400 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1a410 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  le );.      if( 
1a420 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1a430 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  d) ){.        if
1a440 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
1a450 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1a460 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
1a470 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20 20 20   &n)) ){.       
1a480 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
1a490 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1a4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a4b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a4c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30   }.      if( n>0
1a4d0 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
1a4e0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1a4f0 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20    nPage = 1;.   
1a500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a510 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29    nPage = (Pgno)
1a520 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  (n / pPager->pag
1a530 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
1a540 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1a550 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1a560 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
1a570 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1a580 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1a590 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
1a5a0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1a5b0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1a5c0 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20  eValid = 1;.    
1a5d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1a5e0 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1a5f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1a600 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1a610 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a  r than the .  **
1a620 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
1a630 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
1a640 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
1a650 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
1a660 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
1a670 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
1a680 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
1a690 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
1a6a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
1a6b0 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
1a6c0 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  age;.  }..  /* S
1a6d0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
1a6e0 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72  riable and retur
1a6f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20  n SQLITE_OK */. 
1a700 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
1a710 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a720 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1a730 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
1a740 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
1a750 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
1a760 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
1a770 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
1a780 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
1a790 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
1a7a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1a7b0 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
1a7c0 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
1a7d0 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
1a7e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
1a7f0 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
1a800 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
1a810 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
1a820 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
1a830 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
1a840 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
1a850 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
1a860 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
1a870 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
1a880 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
1a890 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
1a8a0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
1a8b0 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
1a8c0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
1a8d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1a8e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
1a8f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1a900 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
1a910 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
1a920 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
1a930 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
1a940 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
1a950 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
1a960 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
1a970 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
1a980 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
1a990 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
1a9a0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
1a9b0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
1a9c0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a9f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
1aa00 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76  /* The OS lock v
1aa10 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68  alues must be th
1aa20 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61  e same as the Pa
1aa30 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20  ger lock values 
1aa40 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  */.  assert( PAG
1aa50 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45  ER_SHARED==SHARE
1aa60 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
1aa70 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56  rt( PAGER_RESERV
1aa80 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ED==RESERVED_LOC
1aa90 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
1aaa0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d  AGER_EXCLUSIVE==
1aab0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1aac0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
1aad0 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
1aae0 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74   unlocked then t
1aaf0 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  he size must be 
1ab00 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20 2a 2a  unknown. It.  **
1ab10 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65 20 62   must not have b
1ab20 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 74 20  een modified at 
1ab30 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2f  this point..  */
1ab40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ab50 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1ab60 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
1ab70 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30  ->dbSizeValid==0
1ab80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ab90 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1aba0 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
1abb0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
1abc0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
1abd0 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
1abe0 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
1abf0 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
1ac00 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
1ac10 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
1ac20 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
1ac30 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
1ac40 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
1ac50 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
1ac60 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
1ac70 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
1ac80 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
1ac90 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
1aca0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
1acb0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
1acc0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1acd0 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
1ace0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  || (pPager->stat
1acf0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1ad00 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47  && locktype==PAG
1ad10 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
1ad20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1ad30 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
1ad40 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  VED && locktype=
1ad50 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
1ad60 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ).  );..  if( pP
1ad70 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
1ad80 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
1ad90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1ada0 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
1adb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1adc0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
1add0 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
1ade0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
1adf0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
1ae00 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
1ae10 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
1ae20 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
1ae30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ae40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
1ae50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28 75  ager->state = (u
1ae60 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  8)locktype;.    
1ae70 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
1ae80 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1ae90 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
1aea0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1aeb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
1aec0 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
1aed0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1aee0 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
1aef0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
1af00 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
1af10 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
1af20 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
1af30 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
1af40 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
1af50 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1af60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1af70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
1af80 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
1af90 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
1afa0 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
1afb0 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
1afc0 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
1afd0 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
1afe0 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
1aff0 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
1b000 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
1b010 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
1b020 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
1b030 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
1b040 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
1b050 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
1b060 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
1b070 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
1b080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
1b090 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
1b0a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1b0b0 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
1b0c0 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
1b0d0 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
1b0e0 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
1b0f0 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
1b100 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
1b110 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
1b120 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
1b130 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
1b140 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
1b150 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
1b160 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
1b170 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
1b180 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
1b190 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
1b1a0 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
1b1b0 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
1b1c0 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65 20 74  viour would be t
1b1d0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
1b1e0 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74  rrent.** content
1b1f0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f   of the page. Ho
1b200 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69  wever, since thi
1b210 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
1b220 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68   present in eith
1b230 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  er.** the databa
1b240 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70  se file or the p
1b250 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f  ortion of the ro
1b260 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1b270 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  nd .** sub-journ
1b280 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  al rolled back t
1b290 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64  he content could
1b2a0 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64   not be restored
1b2b0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61   and the.** data
1b2c0 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64  base image would
1b2d0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1b2e0 20 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65   It is therefore
1b2f0 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20   fortunate that 
1b300 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73  .** this circums
1b310 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69  tance cannot ari
1b320 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  se..*/.#if defin
1b330 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1b340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
1b350 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1b360 72 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70  raintCb(PgHdr *p
1b370 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
1b380 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1b390 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72  DIRTY );.  asser
1b3a0 74 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  t( !subjRequires
1b3b0 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67  Page(pPg) || pPg
1b3c0 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61  ->pgno<=pPg->pPa
1b3d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d  ger->dbSize );.}
1b3e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
1b3f0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
1b400 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  raint(Pager *pPa
1b410 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
1b420 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
1b430 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
1b440 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  e, assertTruncat
1b450 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a  eConstraintCb);.
1b460 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1b470 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
1b480 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
1b490 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b4a0 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
1b4b0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
1b4c0 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
1b4d0 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
1b4e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
1b4f0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
1b500 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
1b510 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
1b520 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
1b530 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
1b540 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
1b550 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
1b560 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
1b570 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
1b580 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
1b590 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
1b5a0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76   committed..*/.v
1b5b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1b5c0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
1b5d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1b5e0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
1b5f0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
1b600 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73  zeValid );.  ass
1b610 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
1b620 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
1b630 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b640 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1b650 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65  ERVED );.  pPage
1b660 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
1b670 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75 6e 63  e;.  assertTrunc
1b680 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
1b690 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ager);.}.../*.**
1b6a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1b6b0 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
1b6c0 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74  attempting a hot
1b6d0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1b6e0 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74  k. It.** syncs t
1b6f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b700 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65  to disk, then se
1b710 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ts pPager->journ
1b720 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20  alHdr to the.** 
1b730 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1b740 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74  nal file so that
1b750 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
1b760 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e  ack() routine kn
1b770 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ows.** that the 
1b780 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66  entire journal f
1b790 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1b7a0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69  ced..**.** Synci
1b7b0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
1b7c0 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20   to disk before 
1b7d0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
1b7e0 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72  ll it back ensur
1b7f0 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61  es .** that if a
1b800 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f   power-failure o
1b810 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
1b820 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
1b830 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61  rocess that.** a
1b840 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b  ttempts rollback
1b850 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65   following syste
1b860 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65 73 20  m recovery sees 
1b870 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c  the same journal
1b880 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74  .** content as t
1b890 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  his process..**.
1b8a0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
1b8b0 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64   goes as planned
1b8c0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1b8d0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1b8e0 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  se, .** an SQLit
1b8f0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
1b900 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1b910 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
1b920 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b930 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b940 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61  E_OK;.  if( !pPa
1b950 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
1b960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b970 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1b980 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  d, SQLITE_SYNC_N
1b990 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66  ORMAL);.  }.  if
1b9a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b9b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1b9c0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1b9d0 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
1b9e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
1b9f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ba00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
1ba10 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
1ba20 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
1ba30 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
1ba40 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
1ba50 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
1ba60 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
1ba70 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1ba80 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1ba90 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
1baa0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1bab0 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
1bac0 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
1bad0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
1bae0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
1baf0 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
1bb00 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
1bb10 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
1bb20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
1bb30 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
1bb40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1bb50 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
1bb60 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
1bb70 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
1bb80 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
1bb90 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
1bba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1bbb0 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
1bbc0 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
1bbd0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
1bbe0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1bbf0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
1bc00 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
1bc10 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
1bc20 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
1bc30 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
1bc40 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1bc50 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1bc60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1bc70 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
1bc80 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
1bc90 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
1bca0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
1bcb0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
1bcc0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
1bcd0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1bce0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1bcf0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1bd00 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
1bd10 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
1bd20 3b 0a 20 20 73 71 6c 69 74 65 33 4c 6f 67 43 6c  ;.  sqlite3LogCl
1bd30 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67  ose(pPager->pLog
1bd40 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  , pPager->fd, pT
1bd50 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mp);.  pPager->p
1bd60 4c 6f 67 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  Log = 0;.  pager
1bd70 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1bd80 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1bd90 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
1bda0 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
1bdb0 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67  {.    /* Set Pag
1bdc0 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  er.journalHdr to
1bdd0 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65   -1 for the bene
1bde0 66 69 74 20 6f 66 20 74 68 65 20 70 61 67 65 72  fit of the pager
1bdf0 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20  _playback() .   
1be00 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d   ** call which m
1be10 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20  ay be made from 
1be20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f  within pagerUnlo
1be30 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e  ckAndRollback().
1be40 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73   If it.    ** is
1be50 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68   not -1, then th
1be60 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  e unsynced porti
1be70 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f  on of an open jo
1be80 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20  urnal file may. 
1be90 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20     ** be played 
1bea0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
1beb0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
1bec0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
1bed0 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  s while.    ** t
1bee0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
1bef0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  , the database m
1bf00 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ay become corrup
1bf10 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
1bf20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1bf30 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
1bf40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
1bf50 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
1bf60 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1bf70 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
1bf80 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
1bf90 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
1bfa0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
1bfb0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
1bfc0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
1bfd0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
1bfe0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
1bff0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c000 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
1c010 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
1c020 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
1c030 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1c040 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
1c050 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
1c060 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
1c070 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
1c080 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
1c090 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
1c0a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
1c0b0 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
1c0c0 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
1c0d0 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
1c0e0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1c0f0 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
1c100 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
1c110 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
1c120 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
1c130 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
1c140 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1c150 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
1c160 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
1c170 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1c180 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
1c190 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
1c1a0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1c1b0 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
1c1c0 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
1c1d0 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
1c1e0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
1c1f0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
1c200 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1c210 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
1c220 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
1c230 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
1c240 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1c250 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1c260 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1c270 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
1c280 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
1c290 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
1c2a0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1c2b0 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
1c2c0 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
1c2d0 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
1c2e0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
1c2f0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1c300 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
1c310 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
1c320 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
1c330 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
1c340 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
1c350 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
1c360 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1c370 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
1c380 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
1c390 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73  nc flag is not s
1c3a0 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
1c3b0 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e  nction is a.** n
1c3c0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
1c3d0 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
1c3e0 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
1c3f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
1c400 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69  .** and the devi
1c410 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1c420 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69  cs of the the fi
1c430 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
1c440 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
1c450 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1c460 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
1c470 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
1c480 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
1c490 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
1c4a0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
1c4b0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
1c4c0 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1c4d0 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
1c4e0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
1c4f0 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
1c500 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
1c510 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1c520 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
1c530 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
1c540 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
1c550 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
1c560 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
1c570 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
1c580 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
1c590 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
1c5a0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
1c5b0 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
1c5c0 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
1c5d0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
1c5e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1c5f0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
1c600 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
1c610 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
1c620 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
1c630 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
1c640 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
1c650 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
1c660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1c670 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
1c680 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
1c690 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
1c6a0 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
1c6b0 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
1c6c0 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
1c6d0 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
1c6e0 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
1c6f0 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
1c700 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
1c710 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
1c720 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
1c730 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
1c740 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
1c750 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
1c760 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
1c770 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e  *.** The Pager.n
1c780 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1c790 6e 65 76 65 72 20 62 65 20 73 65 74 20 66 6f 72  never be set for
1c7a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1c7b0 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65  , or any.** file
1c7c0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f   operating in no
1c7d0 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65  -sync mode (Page
1c7e0 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20  r.noSync set to 
1c7f0 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a  non-zero)..**.**
1c800 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1c810 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  this routine cle
1c820 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ars the PGHDR_NE
1c830 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20  ED_SYNC flag of 
1c840 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63  every .** page c
1c850 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e  urrently held in
1c860 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72   memory before r
1c870 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1c880 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20  OK. If an IO.** 
1c890 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1c8a0 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49  ered, then the I
1c8b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1c8c0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1c8d0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
1c8e0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
1c8f0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1c900 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
1c910 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1c920 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1c930 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1c940 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c950 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1c960 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
1c970 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY ){.      int 
1c980 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9a0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1c9b0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  */.      const i
1c9c0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
1c9d0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1c9e0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1c9f0 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
1ca00 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1ca10 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
1ca20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
1ca30 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1ca40 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
1ca50 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
1ca60 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
1ca70 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
1ca80 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
1ca90 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
1caa0 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
1cab0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
1cac0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
1cad0 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
1cae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
1caf0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1cb00 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
1cb10 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
1cb20 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
1cb30 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
1cb40 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
1cb50 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
1cb60 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
1cb70 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1cb80 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
1cb90 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
1cba0 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
1cbb0 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
1cbc0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
1cbd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
1cbe0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
1cbf0 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
1cc00 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
1cc10 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
1cc20 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
1cc30 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
1cc40 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
1cc50 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
1cc60 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
1cc70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1cc80 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
1cc90 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
1cca0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1ccb0 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
1ccc0 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
1ccd0 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
1cce0 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
1ccf0 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
1cd00 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
1cd10 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
1cd20 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
1cd30 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
1cd40 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
1cd50 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
1cd60 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
1cd70 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
1cd80 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
1cd90 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1cda0 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
1cdb0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1cdc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1cdd0 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
1cde0 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
1cdf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
1ce00 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
1ce10 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
1ce20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
1ce30 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
1ce40 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
1ce50 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
1ce60 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
1ce70 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
1ce80 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
1ce90 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
1cea0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
1ceb0 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
1cec0 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
1ced0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1cee0 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
1cef0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
1cf00 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
1cf10 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
1cf20 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
1cf30 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
1cf40 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
1cf50 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
1cf60 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
1cf70 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
1cf80 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
1cf90 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
1cfa0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
1cfb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1cfc0 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
1cfd0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
1cfe0 61 4d 61 67 69 63 5b 38 5d 3b 0a 09 75 38 20 7a  aMagic[8];..u8 z
1cff0 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
1d000 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b  ournalMagic)+4];
1d010 0a 0a 09 6d 65 6d 63 70 79 28 7a 48 65 61 64 65  ...memcpy(zHeade
1d020 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
1d030 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
1d040 6c 4d 61 67 69 63 29 29 3b 0a 09 70 75 74 33 32  lMagic));..put32
1d050 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
1d060 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1d070 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
1d080 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
1d090 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
1d0a0 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
1d0b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1d0c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1d0d0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
1d0e0 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
1d0f0 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1d100 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d110 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
1d120 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
1d130 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
1d140 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
1d150 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
1d160 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
1d170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1d180 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
1d190 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
1d1a0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
1d1b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d1c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d1d0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1d1e0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d1f0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1d200 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d210 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1d220 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
1d230 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
1d240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1d250 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
1d260 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
1d270 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
1d280 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1d290 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
1d2a0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
1d2b0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
1d2c0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
1d2d0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
1d2e0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
1d2f0 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
1d300 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
1d310 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
1d320 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1d330 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
1d340 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
1d350 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
1d360 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
1d370 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
1d380 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
1d390 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
1d3a0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
1d3b0 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
1d3c0 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
1d3d0 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
1d3e0 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
1d3f0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
1d400 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
1d410 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
1d420 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
1d430 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1d440 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
1d450 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
1d460 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1d470 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
1d480 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1d490 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1d4a0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1d4b0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
1d4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
1d4d0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
1d4e0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
1d4f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d500 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
1d510 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
1d520 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1d530 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d540 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1d550 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1d560 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
1d570 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d580 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1d590 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1d5a0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
1d5b0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
1d5c0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
1d5d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
1d5e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1d5f0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
1d600 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1d610 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
1d620 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
1d630 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
1d640 6c 48 64 72 0a 09 29 3b 0a 20 20 20 20 20 20 20  lHdr..);.       
1d650 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d660 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1d670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d680 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1d690 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1d6a0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
1d6b0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
1d6c0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
1d6d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d6e0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
1d6f0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
1d700 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
1d710 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d720 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1d730 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
1d740 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
1d750 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
1d760 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
1d770 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
1d780 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
1d790 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
1d7a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d7b0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1d7c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1d7d0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f  }..    /* The jo
1d7e0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
1d7f0 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ust successfully
1d800 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67   synced. Set Pag
1d810 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  er.needSync .   
1d820 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20   ** to zero and 
1d830 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
1d840 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1d850 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20  n all pagess..  
1d860 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
1d870 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1d880 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d890 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
1d8a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d8b0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
1d8c0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
1d8d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1d8e0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
1d8f0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1d900 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1d910 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d920 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1d930 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
1d940 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
1d950 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
1d960 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
1d970 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
1d980 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1d990 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
1d9a0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
1d9b0 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
1d9c0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
1d9d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1d9e0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
1d9f0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
1da00 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
1da10 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
1da20 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
1da30 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
1da40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
1da50 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
1da60 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
1da70 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
1da80 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
1da90 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
1daa0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
1dab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dac0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
1dad0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1dae0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1daf0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
1db00 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
1db10 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
1db20 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1db30 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
1db40 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
1db50 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
1db60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1db70 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
1db80 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
1db90 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
1dba0 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
1dbb0 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
1dbc0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
1dbd0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1dbe0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
1dbf0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
1dc00 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
1dc10 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
1dc20 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
1dc30 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
1dc40 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
1dc50 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1dc60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1dc70 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
1dc80 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
1dc90 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
1dca0 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
1dcb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1dcc0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
1dcd0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
1dce0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
1dcf0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1dd00 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
1dd10 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1dd20 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
1dd30 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
1dd40 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
1dd50 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
1dd60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1dd70 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
1dd80 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
1dd90 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
1dda0 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
1ddb0 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
1ddc0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
1ddd0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
1dde0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1ddf0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
1de00 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
1de10 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
1de20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1de30 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1de40 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1de50 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1de60 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1de70 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
1de80 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
1de90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1dea0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
1deb0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
1dec0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
1ded0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
1dee0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1def0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1df00 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
1df10 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
1df20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1df50 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
1df60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1df90 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c  ..  if( NEVER(pL
1dfa0 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ist==0) ) return
1dfb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
1dfc0 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
1dfd0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
1dfe0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1dff0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
1e000 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
1e010 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1e020 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1e030 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
1e040 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
1e050 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
1e060 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
1e070 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
1e080 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
1e090 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
1e0a0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
1e0b0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
1e0c0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
1e0d0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
1e0e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
1e0f0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
1e100 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
1e110 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
1e120 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
1e130 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1e140 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
1e150 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
1e160 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
1e170 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
1e180 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
1e190 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
1e1a0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
1e1b0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
1e1c0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
1e1d0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
1e1e0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
1e1f0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
1e200 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1e210 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1e220 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1e230 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1e240 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1e250 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1e260 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1e270 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
1e280 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
1e290 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1e2a0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
1e2b0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
1e2c0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
1e2d0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1e2e0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
1e2f0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
1e300 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
1e310 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1e320 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
1e330 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e340 21 70 61 67 65 72 55 73 65 4c 6f 67 28 70 4c 69  !pagerUseLog(pLi
1e350 73 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20  st->pPager) );. 
1e360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e370 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1e380 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63 20 3d  SERVED );.  rc =
1e390 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1e3a0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
1e3b0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20  USIVE_LOCK);..  
1e3c0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
1e3d0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
1e3e0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
1e3f0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
1e400 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
1e410 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
1e420 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
1e430 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
1e440 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
1e450 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
1e460 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1e470 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
1e480 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
1e490 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
1e4a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1e4b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e4c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
1e4d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e4e0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1e4f0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
1e500 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
1e510 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
1e520 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
1e530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1e540 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
1e550 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
1e560 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
1e570 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
1e580 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
1e590 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
1e5a0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1e5b0 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
1e5c0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
1e5d0 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
1e5e0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1e5f0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
1e600 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
1e610 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
1e620 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
1e630 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
1e640 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
1e650 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
1e660 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
1e670 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
1e680 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
1e690 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
1e6a0 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
1e6b0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
1e6c0 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
1e6d0 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
1e6e0 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
1e6f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
1e700 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
1e710 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
1e720 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
1e730 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
1e740 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
1e750 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1e760 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
1e770 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
1e780 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
1e790 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1e7c0 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
1e7d0 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63    ..      /* Enc
1e7e0 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
1e7f0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
1e800 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
1e810 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
1e820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1e830 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
1e840 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
1e850 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
1e860 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1e870 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1e880 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
1e890 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e8a0 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
1e8b0 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
1e8c0 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
1e8d0 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
1e8e0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
1e8f0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
1e900 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
1e910 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1e920 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
1e930 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
1e940 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
1e950 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1e960 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
1e970 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
1e980 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
1e990 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
1e9a0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1e9b0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
1e9c0 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
1e9d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e9e0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
1e9f0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1ea00 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1ea10 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1ea20 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1ea30 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
1ea40 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
1ea50 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
1ea60 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
1ea70 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
1ea80 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
1ea90 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1eaa0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1eab0 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
1eac0 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
1ead0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1eae0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
1eaf0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1eb00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1eb10 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1eb20 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1eb30 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
1eb40 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
1eb50 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
1eb60 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1eb70 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
1eb80 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1eb90 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
1eba0 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
1ebb0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
1ebc0 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ite);.    }else{
1ebd0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1ebe0 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
1ebf0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1ec00 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1ec10 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ));.    }.#ifdef
1ec20 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1ec30 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
1ec40 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1ec50 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
1ec60 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
1ec70 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1ec80 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
1ec90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
1eca0 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
1ecb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1ecc0 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
1ecd0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1ece0 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
1ecf0 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
1ed00 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
1ed10 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1ed20 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
1ed30 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
1ed40 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1ed50 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1ed60 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1ed70 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
1ed80 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
1ed90 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
1eda0 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
1edb0 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
1edc0 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
1edd0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1ede0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1edf0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
1ee00 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1ee10 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1ee20 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
1ee30 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
1ee40 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
1ee50 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1ee60 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
1ee70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
1ee80 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
1ee90 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
1eea0 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
1eeb0 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
1eec0 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
1eed0 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
1eee0 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
1eef0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1ef00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1ef10 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
1ef20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1ef30 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f  >sjfd) ){.    vo
1ef40 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
1ef50 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20  >pData;.    i64 
1ef60 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
1ef70 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
1ef80 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1ef90 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
1efa0 0a 0a 20 20 20 20 43 4f 44 45 43 32 28 70 50 61  ..    CODEC2(pPa
1efb0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1efc0 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
1efd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
1efe0 44 61 74 61 32 29 3b 0a 20 20 20 20 50 41 47 45  Data2);.    PAGE
1eff0 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f  RTRACE(("STMT-JO
1f000 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1f010 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1f020 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1f030 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74  );.  .    assert
1f040 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50  ( pagerUseLog(pP
1f050 61 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20  ager) .         
1f060 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  || pageInJournal
1f070 28 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20  (pPg) .         
1f080 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1f090 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
1f0a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
1f0b0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1f0c0 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
1f0d0 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
1f0e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f0f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1f100 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1f110 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
1f120 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1f130 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1f140 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +4);.    }.  }. 
1f150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f160 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
1f170 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
1f180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f190 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
1f1a0 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
1f1b0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
1f1c0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1f1d0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
1f1e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1f1f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f200 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
1f210 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
1f220 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
1f230 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
1f240 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
1f250 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1f260 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
1f270 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
1f280 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
1f290 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
1f2a0 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
1f2b0 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
1f2c0 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
1f2d0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
1f2e0 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
1f2f0 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
1f300 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
1f310 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
1f320 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1f330 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
1f340 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
1f350 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
1f360 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
1f370 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
1f380 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
1f390 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
1f3a0 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
1f3b0 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
1f3c0 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
1f3d0 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
1f3e0 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
1f3f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1f400 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
1f410 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
1f420 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
1f430 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
1f440 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1f450 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1f460 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
1f470 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
1f480 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1f490 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1f4a0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1f4b0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
1f4c0 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
1f4d0 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
1f4e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1f4f0 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
1f500 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
1f510 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
1f520 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
1f530 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
1f540 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
1f550 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1f560 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1f570 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1f580 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
1f590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f5a0 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
1f5b0 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
1f5c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f5d0 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
1f5e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f5f0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1f600 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
1f610 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
1f620 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1f630 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 70 50  R_DIRTY );..  pP
1f640 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
1f650 20 69 66 28 20 70 61 67 65 72 55 73 65 4c 6f 67   if( pagerUseLog
1f660 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1f670 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
1f680 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
1f690 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
1f6a0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1f6b0 6c 69 74 65 33 4c 6f 67 46 72 61 6d 65 73 28 70  lite3LogFrames(p
1f6c0 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 70 50 61  Pager->pLog, pPa
1f6d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
1f6e0 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  Pg, 0, 0, 0);.  
1f6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1f700 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
1f710 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73   is set by the s
1f720 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f730 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  () function whil
1f740 65 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6a  e it.    ** is j
1f750 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74  ournalling a set
1f760 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
1f770 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 74  database pages t
1f780 68 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20  hat are stored. 
1f790 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d     ** on the sam
1f7a0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
1f7b0 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  yncing the journ
1f7c0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  al is not allowe
1f7d0 64 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  d while.    ** t
1f7e0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
1f7f0 20 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74   as it is import
1f800 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d  ant that all mem
1f810 62 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20  bers of such a. 
1f820 20 20 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67     ** set of pag
1f830 65 73 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f  es are synced to
1f840 20 64 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20   disk together. 
1f850 53 6f 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  So, if the page 
1f860 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1f870 20 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74    ** is trying t
1f880 6f 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c  o make clean wil
1f890 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1f8a0 6e 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65  nal sync and the
1f8b0 20 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 20 20 2a   doNotSync.    *
1f8c0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 72  * flag is set, r
1f8d0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1f8e0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 54 68  ing anything. Th
1f8f0 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
1f900 69 6c 6c 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20  ill.    ** just 
1f910 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64  have to go ahead
1f920 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1f930 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20  new page buffer 
1f940 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
1f950 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20  * reusing pPg.. 
1f960 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d     **.    ** Sim
1f970 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70  ilarly, if the p
1f980 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
1f990 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
1f9a0 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1f9b0 0a 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 77  .    ** try to w
1f9c0 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
1f9d0 73 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b  s of pPg to disk
1f9e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f9f0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
1fa00 72 72 43 6f 64 65 29 0a 20 20 20 20 20 7c 7c 20  rrCode).     || 
1fa10 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79  (pPager->doNotSy
1fa20 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73  nc && pPg->flags
1fa30 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1fa40 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1fa50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fa60 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1fa70 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
1fa80 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
1fa90 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
1faa0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1fab0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
1fac0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
1fad0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1fae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1faf0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1fb00 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20  fullSync && .   
1fb10 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
1fb20 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1fb30 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1fb40 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20  MORY) &&.       
1fb50 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
1fb60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fb70 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
1fb80 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1fb90 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b  APPEND).      ){
1fba0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1fbb0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
1fbc0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
1fbd0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1fbe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fbf0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
1fc00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1fc10 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
1fc20 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1fc30 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  ent size of.    
1fc40 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1fc50 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65  image, it may ne
1fc60 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ed to be written
1fc70 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1fc80 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73  nal..    ** This
1fc90 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1fca0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
1fcb0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
1fcc0 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
1fcd0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72    ** actually wr
1fce0 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  ite data to the 
1fcf0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
1fd00 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1fd10 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   Consider the fo
1fd20 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65  llowing sequence
1fd30 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20   of events:.    
1fd40 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49  **.    **   BEGI
1fd50 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a  N;.    **     <j
1fd60 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
1fd70 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66     **     <modif
1fd80 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a  y page X>.    **
1fd90 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
1fda0 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  p;.    **       
1fdb0 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65  <shrink database
1fdc0 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73   file to Y pages
1fdd0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70  >.    **       p
1fde0 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20  agerStress(page 
1fdf0 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f  X).    **     RO
1fe00 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20  LLBACK TO sp;.  
1fe10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28    **.    ** If (
1fe20 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20  X>Y), then when 
1fe30 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63  pagerStress is c
1fe40 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c  alled page X wil
1fe50 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  l not be written
1fe60 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  .    ** out to t
1fe70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fe80 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
1fe90 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
1fea0 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20  ache. Then,.    
1feb0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
1fec0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
1fed0 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61  " statement, rea
1fee0 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c  ding page X will
1fef0 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74   read.    ** dat
1ff00 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1ff10 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
1ff20 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
1ff30 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
1ff40 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20      ** was when 
1ff50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ff60 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20  started, not as 
1ff70 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56  it was when "SAV
1ff80 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a  EPOINT sp".    *
1ff90 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a  * was executed..
1ffa0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1ffb0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
1ffc0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1ffd0 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
1ffe0 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20   X into the .   
1fff0 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
20000 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20  file now (if it 
20010 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74  is not already t
20020 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69  here), so that i
20030 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
20040 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
20050 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
20060 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
20070 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20  K TO sp" is .   
20080 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20   ** executed..  
20090 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56    */.    if( NEV
200a0 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  ER(.        rc==
200b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
200c0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
200d0 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
200e0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
200f0 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63     ) ){.      rc
20100 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
20110 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
20120 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
20130 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
20140 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
20150 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20160 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
20170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20180 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
20190 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
201a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
201b0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
201c0 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
201d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
201e0 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
201f0 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
20200 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
20210 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
20220 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
20230 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
20240 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
20250 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
20260 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
20270 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
20280 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
20290 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
202a0 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
202b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
202c0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
202d0 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
202e0 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
202f0 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
20300 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
20310 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
20320 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
20330 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
20340 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
20350 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
20360 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
20370 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
20380 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
20390 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
203a0 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
203b0 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
203c0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
203d0 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
203e0 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
203f0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
20400 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
20410 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
20420 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
20430 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
20440 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
20450 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
20460 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
20470 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
20480 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
20490 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
204a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
204b0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
204c0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
204d0 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
204e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
204f0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
20500 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
20510 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
20520 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
20530 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
20540 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
20550 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
20560 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a  tExtra() API..**
20570 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
20580 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
20590 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
205a0 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
205b0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
205c0 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
205d0 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
205e0 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
205f0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
20600 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49  of the PAGER_OMI
20610 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41  T_JOURNAL and PA
20620 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20  GER_NO_READLOCK 
20630 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
20640 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
20650 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
20660 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
20670 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
20680 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
20690 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
206a0 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
206b0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
206c0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
206d0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
206e0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
206f0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
20700 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
20710 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
20720 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
20730 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
20740 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
20750 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
20760 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
20770 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
20780 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
20790 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
207a0 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
207b0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
207c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
207d0 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
207e0 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
207f0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
20800 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
20810 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
20820 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
20830 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
20840 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
20850 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
20860 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
20870 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
20880 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
20890 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
208a0 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
208b0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
208c0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
208d0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
208e0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
208f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20910 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
20920 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
20930 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
20940 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
20950 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
20960 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
20970 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
20980 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
20990 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
209a0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
209b0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
209c0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
209d0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
209e0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
209f0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
20a00 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
20a10 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
20a20 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
20a30 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
20a40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
20a50 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
20a60 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
20a70 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
20a80 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
20a90 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
20aa0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
20ab0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
20ac0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
20ad0 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
20ae0 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
20af0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
20b00 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
20b10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20b20 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
20b30 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
20b40 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
20b50 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
20b60 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
20b70 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
20b80 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
20b90 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
20ba0 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
20bb0 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
20bc0 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
20bd0 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
20be0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
20bf0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
20c00 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
20c10 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
20c20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
20c30 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
20c40 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
20c50 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
20c60 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
20c70 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
20c80 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
20c90 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64   */.  int noRead
20ca0 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
20cb0 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
20cc0 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  K)!=0;  /* True 
20cd0 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63  to omit read-loc
20ce0 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  k */.  int pcach
20cf0 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
20d00 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
20d10 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
20d20 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
20d30 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61  he */.  u16 szPa
20d40 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
20d50 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
20d60 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
20d70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f  age size */..  /
20d80 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
20d90 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
20da0 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
20db0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
20dc0 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
20dd0 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
20de0 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
20df0 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
20e00 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20  ournal). This.  
20e10 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ** is the maximu
20e20 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
20e30 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
20e40 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  y journal file h
20e50 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20  andle .  ** and 
20e60 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  a regular journa
20e70 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e  l file-handle. N
20e80 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75  ote that a "regu
20e90 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64  lar journal-hand
20ea0 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  le".  ** may be 
20eb0 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c  a wrapper capabl
20ec0 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65  e of caching the
20ed0 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f   first portion o
20ee0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
20ef0 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72  ** file in memor
20f00 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
20f10 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
20f20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65  optimization (se
20f30 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  e .  ** source f
20f40 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a  ile journal.c)..
20f50 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
20f60 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
20f70 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
20f80 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
20f90 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
20fa0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
20fb0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
20fc0 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Vfs));.  }else{.
20fd0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
20fe0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
20ff0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
21000 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ze());.  }..  /*
21010 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
21020 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
21030 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
21040 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
21050 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
21060 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
21070 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
21080 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
21090 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
210a0 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
210b0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
210c0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
210d0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
210e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
210f0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
21100 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
21110 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
21120 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
21130 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
21140 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
21150 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
21160 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
21170 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
21180 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68  ite3Malloc(nPath
21190 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
211a0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
211b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
211c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
211d0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
211e0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
211f0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
21200 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
21210 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
21220 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
21230 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
21240 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  0;.    }else.#en
21250 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
21260 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
21270 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
21280 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
21290 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
212a0 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20  ) fails */.     
212b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
212c0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
212d0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
212e0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
212f0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  e);.    }..    n
21300 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
21310 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
21320 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
21330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21340 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
21350 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
21360 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
21370 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
21380 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
21390 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
213a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
213b0 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
213c0 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
213d0 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
213e0 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
213f0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
21400 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
21410 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
21420 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
21430 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
21440 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
21450 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
21460 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
21470 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
21480 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
21490 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
214a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
214b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
214c0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
214d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
214e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
214f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
21500 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
21510 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
21520 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
21530 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
21540 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
21550 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
21560 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
21570 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
21580 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
21590 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
215a0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
215b0 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
215c0 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
215d0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
215e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
215f0 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
21600 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
21610 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
21620 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
21630 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
21640 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
21650 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
21660 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
21670 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
21680 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
21690 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
216a0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
216b0 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
216c0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
216d0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
216e0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
216f0 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
21700 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
21710 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
21720 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
21730 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
21740 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
21750 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
21760 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
21770 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
21790 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
217a0 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
217b0 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
217c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
217d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
217e0 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
217f0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
21800 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
21810 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
21820 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
21830 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
21840 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
21850 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
21860 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
21870 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
21880 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
21890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
218a0 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
218b0 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
218c0 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
218d0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
218e0 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
218f0 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20  thname + 8 + 1  
21900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
21910 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
21920 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
21930 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
21940 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
21950 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
21960 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
21970 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
21980 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
21990 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
219a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
219b0 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
219c0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
219d0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
219e0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
219f0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
21a00 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
21a10 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
21a20 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
21a30 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
21a40 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
21a50 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
21a60 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
21a70 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
21a80 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
21a90 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
21aa0 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
21ab0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
21ac0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
21ad0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
21ae0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
21af0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
21b00 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
21b10 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
21b20 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
21b30 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
21b40 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
21b50 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
21b60 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
21b70 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
21b80 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
21b90 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
21ba0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
21bb0 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
21bc0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
21bd0 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
21be0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
21bf0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
21c00 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
21c10 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
21c20 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
21c30 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
21c40 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
21c50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
21c60 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
21c70 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69  rnal", 8);.    i
21c80 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  f( pPager->zFile
21c90 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61  name[0]==0 ) pPa
21ca0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d  ger->zJournal[0]
21cb0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
21cc0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
21cd0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
21ce0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
21cf0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
21d00 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
21d10 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
21d20 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
21d30 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
21d40 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20  zFilename[0] && 
21d50 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e  !memDb ){.    in
21d60 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21d80 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
21d90 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
21da0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
21db0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
21dc0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
21dd0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
21de0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
21df0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
21e00 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
21e10 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
21e20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
21e30 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
21e40 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
21e50 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
21e60 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
21e70 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
21e80 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
21e90 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
21ea0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
21eb0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
21ec0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
21ed0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
21ee0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
21ef0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
21f00 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
21f10 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
21f20 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
21f30 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
21f40 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
21f50 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
21f60 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
21f70 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
21f80 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
21f90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21fa0 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
21fb0 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  ){.      setSect
21fc0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
21fd0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
21fe0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
21ff0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
22000 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
22010 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
22020 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
22030 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
22040 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
22050 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
22060 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
22070 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
22080 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
22090 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
220a0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
220b0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  IZE;.        }el
220c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
220d0 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29  PageDflt = (u16)
220e0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
220f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
22100 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
22110 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
22120 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a  C_WRITE.      {.
22130 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
22140 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
22150 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
22160 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
22170 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
22180 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
22190 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
221a0 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
221b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
221c0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
221d0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
221e0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
221f0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
22200 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
22210 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
22220 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
22230 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
22240 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
22250 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
22260 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
22270 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
22280 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
22290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
222a0 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
222b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
222c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
222d0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ndif.    }.  }el
222e0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
222f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
22300 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
22310 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
22320 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
22330 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
22340 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
22350 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
22360 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
22370 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
22380 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
22390 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
223a0 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
223b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
223c0 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
223d0 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
223e0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
223f0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
22400 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
22410 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
22420 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
22430 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
22440 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
22450 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
22460 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
22470 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20  urnal..    */ . 
22480 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
22490 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
224a0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
224b0 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e  SIVE;.    readOn
224c0 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
224d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
224e0 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
224f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
22500 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
22510 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
22520 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
22530 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
22540 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
22550 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
22560 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
22570 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
22580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22590 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
225a0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
225b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
225c0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
225d0 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
225e0 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
225f0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
22600 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
22610 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
22620 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74   occurred in eit
22630 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
22640 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
22650 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
22660 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
22670 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
22680 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
22690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
226a0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
226b0 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
226c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
226d0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
226e0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
226f0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
22700 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
22710 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
22720 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
22730 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
22740 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20  000 );.  nExtra 
22750 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
22760 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
22770 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
22780 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
22790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
227a0 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
227b0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
227c0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
227d0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
227e0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
227f0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
22800 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
22810 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
22820 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
22830 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
22840 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
22850 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
22860 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
22870 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
22880 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
22890 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
228a0 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
228b0 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
228c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
228d0 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
228e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
228f0 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
22900 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
22910 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
22920 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
22930 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
22940 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
22950 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
22960 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
22970 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
22980 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
22990 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
229a0 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
229b0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
229c0 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
229d0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
229e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
229f0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
22a00 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
22a10 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
22a20 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
22a30 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
22a40 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
22a50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
22a60 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
22a70 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
22a80 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
22a90 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
22aa0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
22ab0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
22ac0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
22ad0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
22ae0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
22af0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
22b00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
22b10 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
22b20 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
22b30 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
22b40 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
22b50 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
22b60 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
22b70 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
22b80 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
22b90 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
22ba0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
22bb0 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  /.  assert( useJ
22bc0 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
22bd0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
22be0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22bf0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
22c00 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
22c10 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  lSync = pPager->
22c20 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70  noSync ?0:1;.  p
22c30 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
22c40 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
22c50 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
22c60 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
22c70 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
22c80 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
22c90 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
22ca0 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
22cb0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
22cc0 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
22cd0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
22ce0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
22cf0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
22d00 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
22d10 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
22d20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
22d30 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
22d40 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
22d50 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
22d60 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
22d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
22d80 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
22d90 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
22da0 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
22db0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
22dc0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
22dd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
22de0 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
22df0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
22e00 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
22e10 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
22e20 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
22e30 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
22e40 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
22e50 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
22e60 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
22e70 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
22e80 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
22e90 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
22ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22eb0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
22ec0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22ed0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
22ee0 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
22ef0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
22f00 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
22f10 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
22f20 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
22f30 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
22f40 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
22f50 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
22f60 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
22f70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
22f80 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
22f90 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
22fa0 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
22fb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
22fc0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
22fd0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
22fe0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
22ff0 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
23000 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
23010 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
23020 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
23030 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
23040 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
23050 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
23060 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
23070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
23080 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
23090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
230a0 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
230b0 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
230c0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
230d0 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
230e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
230f0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
23100 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
23110 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
23120 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
23130 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
23140 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
23150 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
23160 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
23170 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
23180 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
23190 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
231a0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
231b0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
231c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
231d0 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
231e0 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
231f0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
23200 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
23210 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
23220 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
23230 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
23240 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
23250 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
23260 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
23270 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
23280 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
23290 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
232a0 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
232b0 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
232c0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
232d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
232e0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
232f0 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
23300 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
23310 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
23320 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
23330 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
23340 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
23350 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
23360 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
23370 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
23380 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
23390 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
233a0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
233b0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
233c0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
233d0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
233e0 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
233f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
23400 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
23410 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
23420 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
23430 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
23440 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
23450 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
23460 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
23470 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
23480 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
23490 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
234a0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
234b0 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
234c0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
234d0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
234e0 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
234f0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
23500 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
23510 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
23520 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
23530 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
23540 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
23550 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
23560 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
23570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23580 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
23590 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b  */.  int exists;
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
235c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
235d0 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  present */..  as
235e0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
235f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
23600 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
23610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
23620 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
23630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
23640 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
23650 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23660 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20  Pager->state <= 
23670 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
23680 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
23690 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
236a0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
236b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
236c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
236d0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
236e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
236f0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
23700 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
23710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23720 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
23730 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
23740 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
23750 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
23760 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
23770 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
23780 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
23790 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
237a0 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
237b0 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
237c0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
237d0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
237e0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
237f0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
23800 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
23810 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
23820 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
23830 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
23840 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
23850 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
23860 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
23870 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
23880 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
23890 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
238a0 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
238b0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
238c0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
238d0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
238e0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
238f0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
23900 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
23910 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
23920 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
23930 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
23940 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
23950 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
23960 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
23970 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
23980 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
23990 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
239a0 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
239b0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
239c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
239d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
239e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
239f0 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
23a00 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
23a10 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
23a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
23a30 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
23a40 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
23a50 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
23a60 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
23a70 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
23a80 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
23a90 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
23aa0 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
23ab0 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
23ac0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
23ad0 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
23ae0 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
23af0 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
23b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23b10 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
23b20 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
23b30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23b50 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
23b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23b70 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
23b80 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
23b90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
23ba0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
23bb0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
23bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23bd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23be0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
23bf0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
23c00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23c10 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
23c20 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
23c30 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
23c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23c50 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
23c60 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
23c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23c80 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
23c90 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
23ca0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
23cb0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
23cc0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
23cd0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
23ce0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
23cf0 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
23d00 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
23d10 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
23d20 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
23d30 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
23d40 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
23d50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
23d60 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
23d70 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
23d80 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
23d90 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
23da0 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
23db0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
23dc0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
23dd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
23de0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
23df0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
23e00 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
23e10 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
23e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
23e30 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
23e40 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
23e50 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
23e60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23e80 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
23e90 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
23ea0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23eb0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
23ec0 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
23ed0 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
23ee0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23ef0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
23f00 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
23f10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23f20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23f40 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
23f50 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
23f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
23f70 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
23f80 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
23f90 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
23fa0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
23fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
23fc0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
23fd0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
23fe0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
23ff0 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
24000 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
24010 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
24020 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
24030 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
24040 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
24050 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
24060 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
24070 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
24080 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
24090 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
240a0 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
240b0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
240c0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
240d0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
240e0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
240f0 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
24100 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
24110 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
24120 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
24130 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
24140 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
24150 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
24160 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
24170 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
24180 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
24190 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
241a0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
241b0 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
241c0 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
241d0 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
241e0 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
241f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
24200 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
24210 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
24220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24230 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24240 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24250 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
24260 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
24270 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24280 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
24290 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
242a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
242b0 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ile..** It is il
242c0 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
242d0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
242e0 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20  e() until after 
242f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
24300 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
24310 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49  sfully called. I
24320 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  f a shared-lock 
24330 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  is already held 
24340 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e  when.** this fun
24350 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
24360 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
24370 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
24380 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ing operations a
24390 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65  re also performe
243a0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
243b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  on..**.**   1) I
243c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
243d0 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
243e0 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28  R_UNLOCK state (
243f0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
24400 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
24410 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
24420 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
24430 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
24440 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
24450 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
24460 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
24470 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
24480 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
24490 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
244a0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
244b0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
244c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
244d0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
244e0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
244f0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
24500 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
24510 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
24520 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
24530 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
24540 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
24550 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
24560 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
24570 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
24580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
24590 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
245a0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
245b0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
245c0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
245d0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
245e0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
245f0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
24600 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
24610 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
24620 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
24630 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
24640 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
24650 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
24660 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
24670 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
24680 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
24690 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
246a0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
246b0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
246c0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
246d0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
246e0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
246f0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
24700 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
24710 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72   operation descr
24720 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76  ibed by (2) abov
24730 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  e is not attempt
24740 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a  ed, and if the.*
24750 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  * pager is in an
24760 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
24770 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
24780 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73  ULL when this is
24790 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20   called,.** the 
247a0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
247b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
247c0 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74  ed. It is permit
247d0 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a  ted to read the.
247e0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  ** database when
247f0 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   in SQLITE_FULL 
24800 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
24810 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
24820 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
24830 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
24840 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24850 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72  . If an.** IO er
24860 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
24870 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
24880 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
24890 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
248a0 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c  l.** file or rol
248b0 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
248c0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
248d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
248e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
248f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
24900 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
24910 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
24920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
24930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24940 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
24950 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65 74  int isErrorReset
24960 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
24970 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
24980 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72  covering from er
24990 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20  ror state */..  
249a0 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
249b0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  is only called f
249c0 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f  rom b-tree and o
249d0 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61  nly when there a
249e0 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74  re no.  ** outst
249f0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  anding pages */.
24a00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24a10 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
24a20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24a30 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
24a40 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ER(MEMDB && pPag
24a50 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20  er->errCode) ){ 
24a60 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
24a70 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20  rrCode; }..  /* 
24a80 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
24a90 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
24aa0 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 61 20  state, now is a 
24ab0 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a  chance to clear.
24ac0 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20    ** the error. 
24ad0 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  Discard the cont
24ae0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
24af0 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  r-cache and roll
24b00 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f  back.  ** any ho
24b10 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65  t journal in the
24b20 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20   file-system..  
24b30 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
24b40 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
24b50 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24b60 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
24b70 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  r->zJournal ){. 
24b80 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73 65       isErrorRese
24b90 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
24ba0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24bb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24bc0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
24bd0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
24be0 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50  ( pagerUseLog(pP
24bf0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  ager) ){.    int
24c00 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 0a 0a 20   changed = 0;.. 
24c10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4c     rc = sqlite3L
24c20 6f 67 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 70  ogOpenSnapshot(p
24c30 50 61 67 65 72 2d 3e 70 4c 6f 67 2c 20 26 63 68  Pager->pLog, &ch
24c40 61 6e 67 65 64 29 3b 0a 20 20 20 20 69 66 28 20  anged);.    if( 
24c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24c60 0a 20 20 20 20 20 20 69 66 28 20 63 68 61 6e 67  .      if( chang
24c70 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  ed ){.        pa
24c80 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
24c90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
24ca0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
24cb0 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  de || pPager->db
24cc0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
24cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
24ce0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
24cf0 47 45 52 5f 53 48 41 52 45 44 3b 20 20 20 20 20  GER_SHARED;     
24d00 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
24d10 74 68 69 73 20 72 69 67 68 74 3f 20 2a 2f 0a 20  this right? */. 
24d20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24d30 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
24d40 70 50 61 67 65 72 2c 20 26 63 68 61 6e 67 65 64  pPager, &changed
24d50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
24d60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
24d70 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
24d80 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
24d90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24da0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
24db0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
24dc0 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f  .    int isHotJo
24dd0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61  urnal = 0;.    a
24de0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
24df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
24e00 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
24e10 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
24e20 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  he)==0 );.    if
24e30 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64  ( pPager->noRead
24e40 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61 73  lock ){.      as
24e50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65  sert( pPager->re
24e60 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20  adOnly );.      
24e70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
24e80 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
24e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
24ea0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
24eb0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
24ec0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
24ed0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24ef0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24f00 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
24f10 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  OCK );.        r
24f20 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
24f30 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
24f40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24f50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24f60 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
24f70 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  OCK );..    /* I
24f80 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
24f90 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
24fa0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
24fb0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
24fc0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
24fd0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
24fe0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
24ff0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
25000 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
25010 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
25020 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  set ){.      ass
25030 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
25040 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52  te <= PAGER_SHAR
25050 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ED );.      rc =
25060 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
25070 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75  Pager, &isHotJou
25080 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
25090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
250a0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
250b0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
250c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45     }.    if( isE
250d0 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
250e0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
250f0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
25100 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
25110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25120 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
25130 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
25140 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
25150 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
25160 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
25170 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
25180 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
25190 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
251a0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
251b0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
251c0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
251d0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
251e0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
251f0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
25200 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
25210 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
25220 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
25230 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
25240 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
25250 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
25260 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
25270 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
25280 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
25290 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
252a0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
252b0 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
252c0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
252d0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
252e0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
252f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25300 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
25310 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
25320 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
25330 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
25340 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
25350 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
25360 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25370 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
25380 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
25390 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
253a0 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
253b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
253c0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
253d0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
253e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
253f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25400 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
25410 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
25420 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
25430 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
25440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25450 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
25460 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
25470 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
25480 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
25490 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
254a0 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
254b0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
254c0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
254d0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
254e0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
254f0 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
25500 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a  open and.      *
25510 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
25520 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
25530 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
25540 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
25550 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e  .      ** OsTrun
25560 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
25570 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
25580 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
25590 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
255a0 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
255b0 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
255c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
255d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
255e0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d) ){.        in
255f0 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
25600 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
25610 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
25620 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
25630 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
25640 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
25650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
25670 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
25680 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
25690 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
256a0 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
256b0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
256c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
256d0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
256e0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
256f0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
25700 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25710 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
25720 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
25730 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
25740 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
25750 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25770 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
25780 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
25790 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
257a0 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
257b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
257c0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
257d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
257e0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
257f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
25800 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
25810 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
25820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25840 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
25850 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
25860 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
25870 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
25880 6f 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ome .           
25890 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
258a0 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
258b0 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
258c0 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
258d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
258e0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
258f0 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
25900 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
25910 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
25920 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61        ** may mea
25930 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  n that the pager
25940 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f   was in the erro
25950 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r-state when thi
25960 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
25970 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
25980 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75  lled and the jou
25990 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
259a0 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20  ot exist.  */.  
259b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
259c0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
259d0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
259e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
259f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25a00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25a20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
25a30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
25a40 20 52 65 73 65 74 20 74 68 65 20 6a 6f 75 72 6e   Reset the journ
25a50 61 6c 20 73 74 61 74 75 73 20 66 69 65 6c 64 73  al status fields
25a60 20 74 6f 20 69 6e 64 69 63 61 74 65 73 20 74 68   to indicates th
25a70 61 74 20 77 65 20 68 61 76 65 20 6e 6f 0a 20 20  at we have no.  
25a80 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
25a90 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 69 73 20  journal at this 
25aa0 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  time. */.      p
25ab0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
25ac0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
25ad0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25ae0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
25af0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
25b00 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
25b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
25b20 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d   0;. .      /* M
25b30 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75  ake sure the jou
25b40 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
25b50 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  en synced to dis
25b60 6b 2e 20 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a  k. */. .      /*
25b70 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
25b80 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
25b90 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
25ba0 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
25bb0 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
25bc0 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
25bd0 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
25be0 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
25bf0 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
25c00 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
25c10 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
25c20 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
25c30 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
25c40 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
25c50 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
25c60 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
25c70 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
25c80 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
25c90 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
25ca0 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
25cb0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
25cc0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
25cd0 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
25ce0 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
25cf0 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
25d00 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
25d10 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
25d20 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
25d30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
25d40 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
25d50 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
25d60 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
25d70 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
25d80 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
25d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25da0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25db0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
25dc0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
25dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
25de0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25df0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25e00 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
25e10 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
25e20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
25e30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25e40 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
25e50 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
25e60 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
25e70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
25e80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
25e90 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
25ea0 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
25eb0 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  D).      );.    
25ec0 7d 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  }..    if( pPage
25ed0 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71  r->pBackup || sq
25ee0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
25ef0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
25f00 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
25f10 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
25f20 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
25f30 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
25f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
25f50 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
25f60 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
25f70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
25f80 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
25f90 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
25fa0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
25fb0 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
25fc0 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
25fd0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
25fe0 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
25ff0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
26000 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
26010 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
26020 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
26030 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
26040 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
26050 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
26060 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
26070 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
26080 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
26090 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
260a0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
260b0 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
260c0 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
260d0 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
260e0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
260f0 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
26100 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
26110 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
26120 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
26130 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
26140 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
26150 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
26160 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
26170 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
26180 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
26190 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
261a0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
261b0 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
261c0 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
261d0 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
261e0 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
261f0 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
26200 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
26210 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
26220 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   */.      int nP
26230 61 67 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20  age;.      char 
26240 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f  dbFileVers[sizeo
26250 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
26260 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71  Vers)];.      sq
26270 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26280 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
26290 67 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ge);..      if( 
262a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
262b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
262c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
262d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
262e0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
262f0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
26300 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
26310 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
26320 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
26330 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
26340 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
26350 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26360 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
26370 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
26380 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
26390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
263a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
263b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
263c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
263d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
263e0 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69       memset(dbFi
263f0 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f  leVers, 0, sizeo
26400 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
26410 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
26420 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
26430 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
26440 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
26450 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
26460 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
26470 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
26480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26490 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
264a0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
264b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
264c0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
264d0 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
264e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
264f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
26500 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
26510 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
26520 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
26530 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
26540 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
26550 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
26560 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26570 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
26580 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
26590 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
265a0 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
265b0 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
265c0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
265d0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
265e0 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
265f0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
26600 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
26610 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
26620 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
26630 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
26640 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
26650 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
26660 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
26670 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
26680 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
26690 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
266a0 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
266b0 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
266c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
266d0 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  ( (sqlite3Pcache
266e0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
266f0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20  >pPCache)==0).  
26700 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
26710 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
26720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
26730 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  f>0) .  ){.    p
26740 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
26750 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
26760 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
26770 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
26780 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
26790 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
267a0 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
267b0 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
267c0 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
267d0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
267e0 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
267f0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
26800 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
26810 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
26820 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
26830 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
26840 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
26850 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
26860 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
26870 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
26880 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
26890 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
268a0 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
268b0 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
268c0 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
268d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
268e0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
268f0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
26900 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
26910 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
26920 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
26930 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
26940 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
26950 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
26960 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
26970 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
26980 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
26990 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
269a0 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
269b0 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
269c0 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
269d0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
269e0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
269f0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
26a00 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
26a10 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
26a20 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
26a30 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
26a40 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
26a50 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
26a60 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
26a70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
26a80 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
26a90 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
26aa0 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
26ab0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
26ac0 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
26ad0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
26ae0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
26af0 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
26b00 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
26b10 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
26b20 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
26b30 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
26b40 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
26b50 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
26b60 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
26b70 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
26b80 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
26b90 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
26ba0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
26bb0 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
26bc0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
26bd0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
26be0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
26bf0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
26c00 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
26c10 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
26c20 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
26c30 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
26c40 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
26c50 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
26c60 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
26c70 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
26c80 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
26c90 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
26ca0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
26cb0 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
26cc0 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
26cd0 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
26ce0 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
26cf0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
26d00 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
26d10 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
26d20 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
26d30 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
26d40 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
26d50 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
26d60 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
26d70 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
26d80 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
26d90 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
26da0 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
26db0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
26dc0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
26dd0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
26de0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
26df0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
26e00 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
26e10 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
26e20 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
26e30 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
26e40 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
26e50 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
26e60 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
26e70 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
26e80 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
26e90 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
26ea0 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
26eb0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
26ec0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
26ed0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
26ee0 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
26ef0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
26f00 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
26f10 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
26f20 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
26f30 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
26f40 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
26f50 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
26f60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
26f70 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
26f80 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
26f90 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
26fa0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
26fb0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
26fc0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
26fd0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
26fe0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
26ff0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
27000 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
27010 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
27020 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
27030 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
27040 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
27050 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
27060 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
27070 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
27080 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
27090 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
270a0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
270b0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
270c0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
270d0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
270e0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
270f0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
27100 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
27110 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
27120 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
27130 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
27140 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
27150 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
27160 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
27170 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
27180 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
27190 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
271a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
271b0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
271c0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
271d0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
271e0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
271f0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
27200 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
27210 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
27220 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
27230 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
27240 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
27250 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
27260 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
27270 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
27280 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
27290 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
272a0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
272b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
272c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47  Pager->state>PAG
272d0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
272e0 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
272f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27300 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27310 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
27320 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
27330 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
27340 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
27350 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
27360 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
27370 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
27380 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
27390 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
273a0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
273b0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
273c0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
273d0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  E_FULL ){.    rc
273e0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
273f0 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
27400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
27410 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
27420 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
27430 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
27440 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27450 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
27460 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
27470 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
27480 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
27490 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
274a0 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
274b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
274c0 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
274d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
274e0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
274f0 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
27500 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
27510 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
27520 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
27530 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
27540 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
27550 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
27560 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
27570 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
27580 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
27590 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
275a0 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
275b0 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
275c0 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
275d0 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
275e0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
275f0 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
27600 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
27610 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
27620 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
27630 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
27640 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
27650 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
27660 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
27670 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
27680 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
27690 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41  Pager) );.    PA
276a0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
276b0 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75  >nHit);.    retu
276c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
276d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
276e0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
276f0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
27700 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
27710 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
27720 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
27730 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ed.  */.    int 
27740 6e 4d 61 78 3b 0a 0a 20 20 20 20 50 41 47 45 52  nMax;..    PAGER
27750 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
27760 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  iss);.    pPg = 
27770 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
27780 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
27790 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
277a0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
277b0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
277c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
277d0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
277e0 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
277f0 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
27800 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
27810 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
27820 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
27830 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
27840 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
27850 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
27860 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
27870 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
27880 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
27890 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
278a0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
278b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
278c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
278d0 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20  er, &nMax);.    
278e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
278f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
27900 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
27910 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
27920 28 20 4d 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c  ( MEMDB || nMax<
27930 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43  (int)pgno || noC
27940 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65  ontent || !isOpe
27950 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
27960 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
27970 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
27980 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
27990 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
279a0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
279b0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
279c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
279d0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
279e0 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
279f0 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
27a00 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
27a10 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
27a20 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
27a30 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
27a40 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
27a50 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
27a60 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
27a70 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
27a80 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
27a90 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
27aa0 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
27ab0 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
27ac0 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
27ad0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
27ae0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
27af0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
27b00 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
27b10 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
27b20 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
27b30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
27b40 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
27b50 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
27b60 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
27b70 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
27b80 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
27b90 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
27ba0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
27bb0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27bc0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
27bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
27be0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
27bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27c00 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
27c10 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
27c20 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
27c30 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
27c40 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
27c50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
27c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
27c70 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
27c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
27c90 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
27ca0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
27cb0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
27cc0 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
27cd0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
27ce0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
27cf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27d00 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
27d10 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ger );.      rc 
27d20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
27d30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
27d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27d50 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
27d60 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
27d70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
27d80 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
27d90 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
27da0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
27db0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
27dc0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74  endif.  }..  ret
27dd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
27de0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
27df0 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  r:.  assert( rc!
27e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
27e10 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73  if( pPg ){.    s
27e20 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
27e30 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
27e40 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
27e50 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70  (pPager);..  *pp
27e60 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
27e70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27e80 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
27e90 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
27ea0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
27eb0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
27ec0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
27ed0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
27ee0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27ef0 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
27f00 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
27f10 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
27f20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69  Also, return 0 i
27f30 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20  f the .** pager 
27f40 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  is in PAGER_UNLO
27f50 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
27f60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
27f70 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20  alled,.** or if 
27f80 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
27f90 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
27fa0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
27fb0 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  _FULL..**.** See
27fc0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
27fd0 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
27fe0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
27ff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
28000 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
28010 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
28020 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
28030 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
28040 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
28050 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
28060 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
28070 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
28080 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
28090 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
280a0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
280b0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
280c0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
280d0 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
280e0 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
280f0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
28100 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
28110 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
28120 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65  *pPg = 0;.  asse
28130 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
28140 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
28150 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28160 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
28170 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
28180 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20  pPager->state > 
28190 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
281a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
281b0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
281c0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
281d0 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
281e0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
281f0 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
28200 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rence..**.** If 
28210 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
28220 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
28230 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
28240 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
28250 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
28260 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
28270 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
28280 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
28290 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
282a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
282b0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
282c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
282d0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
282e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
282f0 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
28300 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
28310 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
28320 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
28330 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
28340 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
28350 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  g);.    pagerUnl
28360 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
28370 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
28380 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * If the main jo
28390 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61  urnal file has a
283a0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
283b0 65 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ed, ensure that 
283c0 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  the.** sub-journ
283d0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20  al file is open 
283e0 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e  too. If the main
283f0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
28400 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75  open,.** this fu
28410 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
28420 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
28430 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
28440 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
28450 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
28460 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49  lan. .** An SQLI
28470 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
28480 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
28490 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ned if a call to
284a0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70   .** sqlite3OsOp
284b0 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  en() fails..*/.s
284c0 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
284d0 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
284e0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
284f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28500 20 69 66 28 20 28 70 61 67 65 72 55 73 65 4c 6f   if( (pagerUseLo
28510 67 28 70 50 61 67 65 72 29 20 7c 7c 20 69 73 4f  g(pPager) || isO
28520 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28530 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
28540 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
28550 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
28560 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
28570 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
28580 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
28590 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
285a0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
285b0 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
285c0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
285d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
285e0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
285f0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
28600 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
28610 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
28620 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
28640 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
28650 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
28660 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
28670 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
28680 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
28690 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
286a0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
286b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
286c0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
286d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
286e0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
286f0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
28700 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
28710 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
28720 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
28730 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
28740 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
28750 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
28760 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
28770 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
28780 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
28790 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
287a0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
287b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
287c0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
287d0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
287e0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
287f0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
28800 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
28810 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
28820 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
28830 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
28840 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
28850 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
28860 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
28870 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
28880 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
28890 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
288a0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
288b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
288c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
288d0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
288e0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
288f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
28900 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
28910 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
28920 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
28930 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
28940 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
28950 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
28960 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
28970 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
28980 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
28990 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
289a0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
289b0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
289c0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
289d0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
289e0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
289f0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
28a00 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
28a10 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
28a20 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
28a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
28a40 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
28a50 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
28a60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28a70 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a90 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
28aa0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ad0 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
28ae0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  e file */.  sqli
28af0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
28b00 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
28b10 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
28b20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
28b30 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
28b40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
28b50 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
28b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
28b70 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
28b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
28b90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
28ba0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
28bb0 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73  MODE_OFF );.  as
28bc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
28bd0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
28be0 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
28bf0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
28c00 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
28c10 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
28c20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
28c30 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
28c40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
28c50 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
28c60 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
28c70 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
28c80 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
28c90 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
28ca0 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
28cb0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
28cc0 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
28cd0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d  r->dbSizeValid==
28ce0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
28cf0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
28d00 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
28d10 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
28d20 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
28d30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
28d40 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
28d50 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66  ate(nPage);.  if
28d60 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
28d70 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
28d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28d90 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  EM;.  }..  /* Op
28da0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28db0 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
28dc0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
28dd0 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  /.  if( !isOpen(
28de0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
28df0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
28e00 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
28e10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
28e20 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73  EMORY ){.      s
28e30 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
28e40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
28e50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
28e60 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
28e70 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20  ags =           
28e80 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
28e90 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75  lags to open jou
28ea0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20  rnal file */.   
28eb0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
28ec0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
28ed0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
28ee0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
28ef0 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20  tempFile ? .    
28f00 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
28f10 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
28f20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
28f30 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20  P_JOURNAL):.    
28f40 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
28f50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
28f60 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64  .        );.#ifd
28f70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
28f80 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
28f90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28fa0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20  JournalOpen(.   
28fb0 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
28fc0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
28fd0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
28fe0 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  s, jrnlBufferSiz
28ff0 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20  e(pPager).      
29000 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  );.#else.      r
29010 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
29020 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
29030 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
29040 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
29050 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
29060 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
29070 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
29080 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
29090 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72  );.  }...  /* Wr
290a0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
290b0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
290c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
290d0 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20   and open .  ** 
290e0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
290f0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
29100 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
29110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
29120 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
29130 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
29140 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
29150 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
29160 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
29170 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29180 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
29190 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
291a0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
291b0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
291c0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
291d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
291e0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  lOff = 0;.    pP
291f0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
29200 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
29210 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
29220 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a  .    rc = writeJ
29230 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
29240 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
29250 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
29260 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
29270 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
29280 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
29290 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
292a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
292b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
292c0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
292d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
292e0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
292f0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  urnal = 0;.  }. 
29300 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29310 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
29320 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
29330 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
29340 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
29350 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
29360 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
29370 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
29380 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
29390 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
293a0 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
293b0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
293c0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
293d0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
293e0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
293f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29400 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
29410 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
29420 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
29430 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
29440 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
29450 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
29460 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
29470 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
29480 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
29490 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  If this is not a
294a0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
294b0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64  -memory file and
294c0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
294d0 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64  le is .** opened
294e0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62   if it has not b
294f0 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72  een already. For
29500 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
29510 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a  e, the opening .
29520 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** of the journa
29530 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
29540 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
29550 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64  s an actual need
29560 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f   to .** write to
29570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f   the journal. TO
29580 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74  DO: Why handle t
29590 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64  emporary files d
295a0 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a  ifferently?.**.*
295b0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
295c0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
295d0 28 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72  (or if it is alr
295e0 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e  eady open), then
295f0 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65   a.** journal-he
29600 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
29610 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
29620 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  it..**.** If the
29630 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
29640 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
29650 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
29660 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
29670 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
29680 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
29690 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
296a0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
296b0 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
296c0 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
296d0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
296e0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
296f0 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
29700 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
29710 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
29720 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
29730 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
29740 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
29750 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
29760 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
29770 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
29780 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
29790 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
297a0 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
297b0 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
297c0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
297d0 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
297e0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
297f0 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
29800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29810 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
29820 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
29830 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
29840 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
29850 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29870 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
29880 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65 72  LOCK );.  pPager
29890 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
298a0 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
298b0 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  y;.  if( pPager-
298c0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
298d0 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
298e0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
298f0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
29900 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
29910 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
29920 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28  File );..    if(
29930 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61   pagerUseLog(pPa
29940 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
29950 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
29960 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
29970 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
29980 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
29990 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
299a0 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2e 20  XCLUSIVE state. 
299b0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
299c0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
299d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
299e0 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
299f0 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
29a00 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
29a10 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
29a20 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
29a30 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
29a40 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
29a50 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
29a60 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
29a70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
29a80 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 57 72  c = sqlite3LogWr
29a90 69 74 65 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  iteLock(pPager->
29aa0 70 4c 6f 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  pLog, 1);.      
29ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29ac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
29ad0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
29ae0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
29af0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
29b00 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
29b10 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
29b20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
29b30 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
29b40 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
29b50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29b60 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
29b70 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
29b80 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
29b90 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
29ba0 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
29bb0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
29bc0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
29bd0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
29be0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
29bf0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
29c00 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
29c10 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
29c20 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
29c30 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
29c40 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
29c50 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
29c60 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
29c70 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
29c80 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
29c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29ca0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
29cb0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
29cc0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
29cd0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
29ce0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
29cf0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
29d00 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
29d10 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
29d20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29d30 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65   }..    /* No ne
29d40 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ed to open the j
29d50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
29d60 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69  his time.  It wi
29d70 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65  ll be.    ** ope
29d80 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  ned before it is
29d90 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66   written to.  If
29da0 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e   we defer openin
29db0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20  g the journal,. 
29dc0 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73     ** we might s
29dd0 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  ave the work of 
29de0 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
29df0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
29e00 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75  on.    ** ends u
29e10 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e  p being a no-op.
29e20 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  .    */.  }else 
29e30 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
29e40 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
29e50 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
29e60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
29e70 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
29e80 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
29e90 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
29ea0 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20  ode the last.   
29eb0 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
29ec0 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
29ed0 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
29ee0 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
29ef0 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
29f00 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
29f10 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
29f20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29f30 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
29f40 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65   kept open and e
29f50 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61  ither was trunca
29f60 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f  ted to 0 bytes o
29f70 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73  r its header was
29f80 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74  .    ** overwrit
29f90 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ten with zeros..
29fa0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
29fb0 74 28 20 70 61 67 65 72 55 73 65 4c 6f 67 28 70  t( pagerUseLog(p
29fc0 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
29fd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29fe0 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
29ff0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a000 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
2a010 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a020 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2a030 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
2a040 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
2a050 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
2a060 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
2a070 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
2a080 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2a090 29 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  )));.  if( rc!=S
2a0a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a0b0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2a0c0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
2a0d0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79     /* Ignore any
2a0e0 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f   IO error that o
2a0f0 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61 67  ccurs within pag
2a100 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2a110 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a  on(). The.    **
2a120 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
2a130 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65   call is to rese
2a140 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
2a150 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
2a160 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73  r.    ** sub-sys
2a170 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20  tem. It doesn't 
2a180 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f  matter if the jo
2a190 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
2a1a0 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a  t properly.    *
2a1b0 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74  * finalized at t
2a1c0 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65  his point (since
2a1d0 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c   it is not a val
2a1e0 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
2a1f0 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a  anyway)..    */.
2a200 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
2a210 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2a220 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
2a230 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a240 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
2a250 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
2a260 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
2a270 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
2a280 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
2a290 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
2a2a0 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
2a2b0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
2a2c0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
2a2d0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
2a2e0 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
2a2f0 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
2a300 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
2a310 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2a320 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
2a330 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
2a340 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
2a350 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
2a360 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
2a370 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2a380 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
2a390 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2a3a0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
2a3b0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
2a3c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2a3d0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
2a3e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a3f0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
2a400 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
2a410 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  ed unless a tran
2a420 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2a430 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74  ady been.  ** st
2a440 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  arted..  */.  as
2a450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2a460 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2a470 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
2a480 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
2a490 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
2a4a0 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
2a4b0 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
2a4c0 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  * again..  */.  
2a4d0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2a4e0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65  ->errCode) )  re
2a4f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2a500 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68  Code;..  /* High
2a510 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er-level routine
2a520 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69  s never call thi
2a530 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61  s function if da
2a540 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20  tabase is not.  
2a550 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75  ** writable.  Bu
2a560 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20  t check anyway, 
2a570 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e  just for robustn
2a580 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
2a590 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64  VER(pPager->read
2a5a0 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53  Only) ) return S
2a5b0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61  QLITE_PERM;..  a
2a5c0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2a5d0 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
2a5e0 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
2a5f0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2a600 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
2a610 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
2a620 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2a630 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
2a640 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
2a650 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
2a660 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
2a670 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2a680 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
2a690 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
2a6a0 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
2a6b0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2a6c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2a6d0 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
2a6e0 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
2a6f0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2a700 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
2a710 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
2a720 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
2a730 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2a740 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2a750 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2a760 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2a770 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
2a780 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
2a790 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
2a7a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68    **.    ** High
2a7b0 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
2a7c0 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  s should have al
2a7d0 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61 20  ready started a 
2a7e0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20  transaction,.   
2a7f0 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20   ** which means 
2a800 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69 72  they have acquir
2a810 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
2a820 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72   locks but the r
2a830 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2a840 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
2a850 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   yet be open..  
2a860 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2a870 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
2a880 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65  pPager, 0, pPage
2a890 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  r->subjInMemory)
2a8a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2a8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a8c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a8d0 7d 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  }.    if( !isOpe
2a8e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a  n(pPager->jfd) .
2a8f0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2a900 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2a910 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a920 46 46 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  FF .     && pPag
2a930 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2a940 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a950 44 45 5f 57 41 4c 20 0a 20 20 20 20 29 7b 0a 20  DE_WAL .    ){. 
2a960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2a970 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2a980 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2a990 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
2a9a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2a9b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a9c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2a9d0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
2a9e0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
2a9f0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
2aa00 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
2aa10 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
2aa20 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
2aa30 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
2aa40 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
2aa50 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
2aa60 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
2aa70 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
2aa80 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
2aa90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
2aaa0 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
2aab0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
2aac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2aad0 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28   !pageInJournal(
2aae0 70 50 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70  pPg) && isOpen(p
2aaf0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2ab00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
2ab10 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72  gerUseLog(pPager
2ab20 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
2ab30 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
2ab40 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
2ab50 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
2ab60 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
2ab70 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20  *pData2;..      
2ab80 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
2ab90 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
2aba0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
2abb0 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
2abc0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
2abd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
2abe0 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
2abf0 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
2ac00 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
2ac10 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
2ac20 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2ac30 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
2ac40 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2ac50 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  r) );..        a
2ac60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
2ac70 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
2ac80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
2ac90 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
2aca0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
2acb0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
2acc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2acd0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
2ace0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
2acf0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
2ad00 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
2ad10 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
2ad20 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
2ad30 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
2ad40 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
2ad50 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
2ad60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ad70 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2ad80 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2ad90 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
2ada0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2adb0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2add0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
2ade0 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20  rnalOff + 4);.  
2adf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2ae00 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
2ae10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
2ae20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ae30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ae40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ae50 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2ae60 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
2ae70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ae80 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
2ae90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
2aea0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
2aeb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aec0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
2aed0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
2aee0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
2aef0 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
2af00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2af10 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
2af20 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
2af30 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
2af40 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
2af50 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
2af60 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2af70 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
2af80 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
2af90 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
2afa0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2afb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2afc0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
2afd0 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
2afe0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2aff0 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
2b000 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
2b010 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  )));..        /*
2b020 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
2b030 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
2b040 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
2b050 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
2b060 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2b070 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
2b080 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
2b090 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
2b0a0 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
2b0b0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
2b0c0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
2b0d0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
2b0e0 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
2b0f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
2b100 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
2b110 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
2b120 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
2b130 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
2b140 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
2b150 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
2b160 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
2b170 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
2b180 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
2b190 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
2b1a0 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
2b1b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2b1c0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2b1d0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
2b1e0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
2b1f0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2b200 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
2b210 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2b220 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  1;.        }..  
2b230 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
2b240 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77  r has occurred w
2b250 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
2b260 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
2b270 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
2b280 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
2b290 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
2b2a0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
2b2b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2b2c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b2d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b2e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b2f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2b300 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
2b310 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b320 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b330 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
2b340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
2b350 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
2b360 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
2b370 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
2b380 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
2b390 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
2b3a0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2b3b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
2b3c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
2b3d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
2b3e0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
2b3f0 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
2b400 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2b410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2b430 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2b440 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
2b450 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b480 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
2b490 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
2b4a0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
2b4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
2b4c0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2b4d0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
2b4e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
2b4f0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2b500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
2b510 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
2b520 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
2b530 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
2b540 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2b550 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2b560 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
2b570 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
2b580 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b590 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
2b5a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
2b5b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
2b5c0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
2b5d0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
2b5e0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
2b5f0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
2b600 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
2b610 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
2b620 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
2b630 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
2b640 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
2b650 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
2b660 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
2b670 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
2b680 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
2b690 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
2b6a0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
2b6b0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
2b6c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
2b6d0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2b6e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2b6f0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b700 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
2b710 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
2b720 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
2b730 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
2b740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b750 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
2b760 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
2b770 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
2b780 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
2b790 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
2b7a0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
2b7b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b7c0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
2b7d0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
2b7e0 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
2b7f0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
2b800 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
2b810 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
2b820 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
2b830 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
2b840 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
2b850 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2b860 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
2b870 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
2b880 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
2b890 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
2b8a0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
2b8b0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
2b8c0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
2b8d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2b8e0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
2b8f0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2b900 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
2b910 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
2b920 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
2b930 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
2b940 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
2b950 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
2b960 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
2b970 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
2b980 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
2b990 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
2b9a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2b9b0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
2b9c0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
2b9d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2b9e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
2b9f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2ba00 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
2ba10 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
2ba20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2ba30 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
2ba40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
2ba50 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
2ba60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ba70 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
2ba80 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
2ba90 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2baa0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2bab0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
2bac0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
2bad0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
2bae0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
2baf0 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
2bb00 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
2bb10 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
2bb20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
2bb30 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2bb40 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2bb50 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
2bb60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bb70 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
2bb80 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
2bb90 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
2bba0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
2bbb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2bbc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2bbd0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
2bbe0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
2bbf0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2bc20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
2bc30 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
2bc40 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
2bc50 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
2bc60 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
2bc70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
2bc80 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
2bc90 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
2bca0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
2bcb0 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
2bcc0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
2bcd0 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
2bce0 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
2bcf0 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
2bd00 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
2bd10 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2bd20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2bd30 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
2bd40 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
2bd50 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
2bd60 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
2bd70 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
2bd80 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
2bd90 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
2bda0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
2bdb0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
2bdc0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
2bdd0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
2bde0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
2bdf0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
2be00 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
2be10 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
2be20 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
2be30 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
2be40 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
2be50 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
2be60 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71   1;..    rc = sq
2be70 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
2be80 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
2be90 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
2bea0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2beb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
2bec0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
2bed0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
2bee0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
2bef0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
2bf00 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
2bf10 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
2bf20 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
2bf30 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
2bf40 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
2bf50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bf60 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
2bf70 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
2bf80 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
2bf90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
2bfa0 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
2bfb0 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
2bfc0 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
2bfd0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
2bfe0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
2bff0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
2c000 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
2c010 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
2c020 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
2c030 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
2c040 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
2c050 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
2c060 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2c070 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
2c080 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
2c090 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
2c0a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c0b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2c0c0 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
2c0d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2c0e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c100 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2c110 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2c120 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2c130 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2c140 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
2c150 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
2c160 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2c170 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
2c180 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
2c190 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c1a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2c1b0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2c1c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2c1e0 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
2c1f0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2c200 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
2c210 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2c220 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
2c230 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
2c240 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
2c250 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2c260 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2c270 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
2c280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c290 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
2c2a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
2c2b0 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
2c2c0 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
2c2d0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
2c2e0 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
2c2f0 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
2c300 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
2c310 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
2c320 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
2c330 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
2c340 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
2c350 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
2c360 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
2c370 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
2c380 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
2c390 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
2c3a0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
2c3b0 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
2c3c0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
2c3d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c3e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
2c3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c400 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20  _OK && needSync 
2c410 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c420 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
2c430 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
2c440 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
2c450 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
2c460 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
2c470 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
2c480 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
2c490 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
2c4a0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
2c4b0 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
2c4c0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
2c4d0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
2c4e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2c4f0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
2c500 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c510 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
2c520 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
2c530 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
2c540 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
2c550 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
2c560 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
2c570 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2c580 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
2c590 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
2c5a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c5b0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2c5c0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
2c5d0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
2c5e0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
2c5f0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
2c600 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c610 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
2c620 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
2c630 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
2c640 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
2c650 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2c660 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
2c670 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
2c680 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c690 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
2c6a0 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
2c6b0 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
2c6c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
2c6d0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
2c6e0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
2c6f0 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
2c700 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2c710 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
2c720 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
2c730 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
2c740 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
2c750 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
2c760 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
2c770 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69  d as dirty.  Thi
2c780 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
2c790 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20  xample, when.** 
2c7a0 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
2c7b0 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61  n added as a lea
2c7c0 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
2c7d0 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20  t and so its.** 
2c7e0 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65  content no longe
2c7f0 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  r matters..**.**
2c800 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
2c810 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
2c820 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
2c830 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
2c840 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
2c850 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
2c860 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20  used. The pager 
2c870 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
2c880 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
2c890 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
2c8a0 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
2c8b0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
2c8c0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
2c8d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
2c8e0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
2c8f0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a  eed of large .**
2c900 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2c910 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
2c920 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2c930 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2c940 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c950 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2c960 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
2c970 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
2c980 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2c990 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47  nt==0 ){.    PAG
2c9a0 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57  ERTRACE(("DONT_W
2c9b0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
2c9c0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
2c9d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2c9e0 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  )));.    IOTRACE
2c9f0 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
2ca00 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
2ca10 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e  pgno)).    pPg->
2ca20 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
2ca30 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
2ca40 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
2ca50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
2ca60 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
2ca70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
2ca80 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2ca90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2caa0 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
2cab0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
2cac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2cad0 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d  file .** change-
2cae0 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20  counter, stored 
2caf0 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d  as a 4-byte big-
2cb00 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73  endian integer s
2cb10 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62  tarting at .** b
2cb20 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66  yte offset 24 of
2cb30 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2cb40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
2cb50 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
2cb60 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
2cb70 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61  is is done by ca
2cb80 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  lling .** sqlite
2cb90 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
2cba0 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f   page 1, then mo
2cbb0 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
2cbc0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  ents of the.** p
2cbd0 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69  age data. In thi
2cbe0 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20  s case the file 
2cbf0 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20  will be updated 
2cc00 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
2cc10 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2cc20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
2cc30 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74  .** The isDirect
2cc40 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e  Mode flag may on
2cc50 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
2cc60 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
2cc70 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
2cc80 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
2cc90 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2cca0 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
2ccb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2ccc0 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
2ccd0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2cce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ccf0 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
2cd00 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
2cd10 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
2cd20 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
2cd30 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
2cd40 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
2cd50 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
2cd60 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
2cd70 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
2cd80 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
2cd90 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
2cda0 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
2cdb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cdc0 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  K;..  /* Declare
2cdd0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2cde0 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
2cdf0 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
2ce00 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
2ce10 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2ce20 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
2ce30 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
2ce40 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
2ce50 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
2ce60 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
2ce70 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
2ce80 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
2ce90 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
2cea0 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
2ceb0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
2cec0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
2ced0 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
2cee0 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
2cef0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2cf00 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
2cf10 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
2cf20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
2cf30 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
2cf40 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
2cf50 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
2cf60 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
2cf70 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
2cf80 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
2cf90 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
2cfa0 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
2cfb0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2cfc0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2cfd0 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
2cfe0 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
2cff0 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
2d000 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
2d010 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
2d020 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
2d030 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
2d040 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
2d050 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  ode.#endif..  as
2d060 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2d070 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2d080 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50  VED );.  if( !pP
2d090 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2d0a0 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d  tDone && pPager-
2d0b0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
2d0c0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d0e0 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
2d0f0 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32  age 1 */.    u32
2d100 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
2d110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2d120 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63  itial value of c
2d130 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
2d140 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  eld */..    asse
2d150 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
2d160 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
2d170 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
2d180 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
2d190 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
2d1a0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
2d1b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d1c0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2d1d0 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
2d1e0 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
2d1f0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
2d200 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
2d210 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
2d220 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
2d230 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
2d240 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
2d250 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
2d260 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
2d270 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
2d280 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
2d290 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
2d2a0 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
2d2b0 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
2d2c0 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
2d2d0 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
2d2e0 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
2d2f0 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
2d300 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
2d310 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
2d320 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
2d330 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
2d340 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
2d350 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
2d360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d370 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
2d380 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2d390 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d3a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
2d3b0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2d3c0 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
2d3d0 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
2d3e0 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
2d3f0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2d400 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
2d410 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
2d420 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
2d430 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2d440 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
2d450 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2d460 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
2d470 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2d480 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20  ..      /* Also 
2d490 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65  store the SQLite
2d4a0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
2d4b0 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20  in bytes 96..99 
2d4c0 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  */.      put32bi
2d4d0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2d4e0 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  r->pData)+96, SQ
2d4f0 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
2d500 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  BER);..      /* 
2d510 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
2d520 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
2d530 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2d540 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
2d550 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
2d560 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b  ( DIRECT_MODE ){
2d570 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
2d580 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48  oid *zBuf = pPgH
2d590 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  dr->pData;.     
2d5a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d5b0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
2d5c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d5d0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2d5e0 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
2d5f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2d600 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2d610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2d630 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2d640 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2d650 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2d660 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2d670 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2d680 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2d690 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
2d6a0 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
2d6b0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
2d6c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2d6d0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
2d6e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d6f0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
2d700 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
2d710 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
2d720 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
2d730 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
2d740 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
2d750 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
2d760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
2d770 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
2d780 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
2d790 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
2d7a0 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
2d7b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2d7c0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
2d7d0 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
2d7e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2d7f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d800 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
2d810 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2d820 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d840 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2d850 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  */.  assert( !ME
2d860 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
2d870 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2d880 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d890 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2d8a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
2d8b0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
2d8c0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
2d8d0 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
2d8e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
2d8f0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2d900 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
2d910 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
2d920 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
2d930 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
2d940 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2d950 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2d960 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
2d970 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
2d980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
2d990 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
2d9a0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
2d9b0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
2d9c0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
2d9d0 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
2d9e0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
2d9f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2da00 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
2da10 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2da20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2da30 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
2da40 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
2da50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
2da60 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
2da70 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2da80 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
2da90 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
2daa0 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
2dab0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2dac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
2dad0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
2dae0 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
2daf0 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
2db00 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
2db10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2db20 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
2db30 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
2db40 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
2db50 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2db60 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
2db70 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
2db80 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
2db90 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
2dba0 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
2dbb0 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
2dbc0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
2dbd0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
2dbe0 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
2dbf0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
2dc00 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
2dc10 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
2dc20 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
2dc30 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
2dc40 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
2dc50 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2dc60 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
2dc70 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
2dc80 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
2dc90 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
2dca0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2dcb0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
2dcc0 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
2dcd0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
2dce0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
2dcf0 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
2dd00 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
2dd10 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
2dd20 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
2dd30 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
2dd40 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
2dd50 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
2dd60 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
2dd70 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2dd80 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
2dd90 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
2dda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ddb0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
2ddc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
2ddd0 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
2dde0 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
2ddf0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2de00 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
2de10 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de30 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
2de40 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
2de50 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
2de60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2de70 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2de80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2de90 0a 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69  ..  /* The dbOri
2dea0 67 53 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73  gSize is never s
2deb0 65 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  et if journal_mo
2dec0 64 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65  de=OFF */.  asse
2ded0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2dee0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2def0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
2df00 7c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  | pPager->dbOrig
2df10 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Size==0 );..  /*
2df20 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   If a prior erro
2df30 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f  r occurred, repo
2df40 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67  rt that error ag
2df50 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ain. */.  if( NE
2df60 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2df70 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
2df80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
2df90 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2dfa0 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
2dfb0 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
2dfc0 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
2dfd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
2dfe0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
2dff0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
2e000 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  );..  if( MEMDB 
2e010 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2e020 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  ified ){.    /* 
2e030 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
2e040 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
2e050 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
2e060 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
2e070 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e   this.    ** fun
2e080 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2e090 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
2e0a0 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f  t is mostly a no
2e0b0 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c 20 61  -op.  However, a
2e0c0 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b 75 70  ny.    ** backup
2e0d0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e 65 65   in progress nee
2e0e0 64 73 20 74 6f 20 62 65 20 72 65 73 74 61 72 74  ds to be restart
2e0f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
2e100 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
2e110 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
2e120 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  kup);.  }else if
2e130 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2e140 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
2e150 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2e160 69 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ied ){.    if( p
2e170 61 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65  agerUseLog(pPage
2e180 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  r) ){.      PgHd
2e190 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  r *pList = sqlit
2e1a0 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2e1b0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2e1c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
2e1d0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ist ){.        r
2e1e0 63 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 46 72  c = sqlite3LogFr
2e1f0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 4c 6f  ames(pPager->pLo
2e200 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
2e210 69 7a 65 2c 20 70 4c 69 73 74 2c 0a 20 20 20 20  ize, pList,.    
2e220 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2e230 64 62 53 69 7a 65 2c 20 31 2c 20 31 0a 20 20 20  dbSize, 1, 1.   
2e240 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
2e250 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
2e260 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
2e270 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2e290 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2e2a0 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
2e2b0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2e2c0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
2e2d0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74  .      ** does t
2e2e0 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  his depends on w
2e2f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
2e300 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
2e310 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
2e320 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65     ** was enable
2e330 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  d at compile tim
2e340 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74  e, and if this t
2e350 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73  ransaction meets
2e360 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72   the .      ** r
2e370 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
2e380 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
2e390 74 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a  tion: .      **.
2e3a0 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68        **    * Th
2e3b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
2e3c0 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
2e3d0 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
2e3e0 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20   for.      **   
2e3f0 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
2e400 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
2e410 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20   .      **    * 
2e420 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e  This commit is n
2e430 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  ot part of a mul
2e440 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74  ti-file transact
2e450 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ion, and.      *
2e460 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
2e470 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
2e480 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
2e490 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
2e4a0 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
2e4b0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
2e4c0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77  e optimization w
2e4d0 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61  as not enabled a
2e4e0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2e4f0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  then the.      *
2e500 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
2e510 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
2e520 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2e530 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2e540 61 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ange.      ** co
2e550 75 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65  unter in 'indire
2e560 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65  ct-mode'. If the
2e570 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2e580 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74   compiled in but
2e590 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  .      ** is not
2e5a0 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74   applicable to t
2e5b0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
2e5c0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75   call sqlite3Jou
2e5d0 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20  rnalCreate().   
2e5e0 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75     ** to make su
2e5f0 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
2e600 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ile has actually
2e610 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74   been created, t
2e620 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a  hen call.      *
2e630 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
2e640 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
2e650 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
2e660 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64  e-counter in ind
2e670 69 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d  irect.      ** m
2e680 6f 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ode. .      **. 
2e690 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
2e6a0 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  e, if the optimi
2e6b0 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65  zation is both e
2e6c0 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69  nabled and appli
2e6d0 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20  cable,.      ** 
2e6e0 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
2e6f0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2e700 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2e710 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2e720 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64  r.      ** in 'd
2e730 69 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20  irect' mode. In 
2e740 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2e750 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
2e760 6e 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a  never be.      *
2e770 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  * created for th
2e780 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
2e790 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65        */.  #ifde
2e7a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e7b0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2e7c0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
2e7d0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
2e7e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2e7f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
2e800 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2e810 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2e820 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61  ;.      if( !zMa
2e830 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70  ster && isOpen(p
2e840 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20  Pager->jfd) .   
2e850 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
2e860 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
2e870 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
2e880 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61  ) .       && pPa
2e890 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61  ger->dbSize>=pPa
2e8a0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  ger->dbFileSize.
2e8b0 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70         && (0==(p
2e8c0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
2e8d0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2e8e0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c  er->pPCache)) ||
2e8f0 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29   0==pPg->pDirty)
2e900 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2e910 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
2e920 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
2e930 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64  ounter via the d
2e940 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68  irect-write meth
2e950 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  od. The .       
2e960 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61   ** following ca
2e970 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74  ll will modify t
2e980 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
2e990 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
2e9a0 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a  age 1 .        *
2e9b0 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  * to include the
2e9c0 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20   updated change 
2e9d0 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
2e9e0 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20   write page 1 . 
2e9f0 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74         ** direct
2ea00 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
2ea10 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65  se file. Because
2ea20 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   of the atomic-w
2ea30 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  rite .        **
2ea40 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
2ea50 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
2ea60 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
2ea70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2ea80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
2ea90 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2eaa0 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
2eab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2eac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2ead0 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
2eae0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2eaf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2eb00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2eb10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2eb20 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2eb30 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2eb40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2eb50 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
2eb60 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2eb70 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
2eb80 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20  , 0);.  #endif. 
2eb90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2eba0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2ebb0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2ebc0 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  xit;.  .      /*
2ebd0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
2ebe0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
2ebf0 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
2ec00 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
2ec10 65 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  es.      ** bein
2ec20 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
2ec30 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
2ec40 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
2ec50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
2ec60 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73     ** file. This
2ec70 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2ec80 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2ec90 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  mode..      **. 
2eca0 20 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72       ** Before r
2ecb0 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73  eading the pages
2ecc0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
2ecd0 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  rs larger than t
2ece0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72  he .      ** cur
2ecf0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
2ed00 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20  ger.dbSize, set 
2ed10 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  dbSize back to t
2ed20 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a  he value.      *
2ed30 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61  * that it took a
2ed40 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2ed50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
2ed60 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20  Otherwise, the. 
2ed70 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f       ** calls to
2ed80 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2ed90 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64  () return zeroed
2eda0 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f   pages instead o
2edb0 66 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  f .      ** read
2edc0 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ing data from th
2edd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ede0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2edf0 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f  ** When journal_
2ee00 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62  mode==OFF the db
2ee10 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61  OrigSize is alwa
2ee20 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73  ys zero, so this
2ee30 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  .      ** block 
2ee40 6e 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f  never runs if jo
2ee50 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a  urnal_mode=OFF..
2ee60 20 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64        */.  #ifnd
2ee70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ee80 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2ee90 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2eea0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ze<pPager->dbOri
2eeb0 67 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26  gSize .       &&
2eec0 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
2eed0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2eee0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2eef0 46 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  FF).      ){.   
2ef00 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20       Pgno i;    
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ef30 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2ef40 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
2ef50 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20  onst Pgno iSkip 
2ef60 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
2ef70 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64  pPager); /* Pend
2ef80 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f  ing lock page */
2ef90 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
2efa0 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61  gno dbSize = pPa
2efb0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20  ger->dbSize;    
2efc0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
2efd0 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20  mage size */ .  
2efe0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2eff0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2f000 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20  bOrigSize;.     
2f010 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65     for( i=dbSize
2f020 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64  +1; i<=pPager->d
2f030 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29  bOrigSize; i++ )
2f040 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2f050 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
2f060 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
2f070 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d  urnal, i) && i!=
2f080 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
2f090 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2f0a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2f0b0 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
2f0c0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  l */.           
2f0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f0e0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
2f0f0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
2f100 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f110 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2f120 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2f130 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
2f140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f150 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
2f160 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2f170 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2f180 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2f190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f1a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2f1b0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2f1c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
2f1d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f1e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2f1f0 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  = dbSize;.      
2f200 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20  } .  #endif.  . 
2f210 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
2f220 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2f230 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
2f240 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
2f250 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20  a master .      
2f260 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2f270 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
2f280 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2f290 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f2a0 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  e, .      ** or 
2f2b0 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55  if zMaster is NU
2f2c0 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  LL (no master jo
2f2d0 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69  urnal), then thi
2f2e0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
2f2f0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
2f300 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
2f310 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
2f320 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
2f330 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f340 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2f350 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2f360 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79  ;.  .      /* Sy
2f370 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2f380 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d  ile. If the atom
2f390 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
2f3a0 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a  zation is being.
2f3b0 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74        ** used, t
2f3c0 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f  his call will no
2f3d0 74 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75  t create the jou
2f3e0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72  rnal file or per
2f3f0 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a  form any.      *
2f400 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20  * real IO..     
2f410 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2f420 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2f430 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2f440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2f450 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2f460 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
2f470 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
2f480 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
2f490 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f4a0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2f4b0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2f4c0 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63  list(sqlite3Pcac
2f4d0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2f4e0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20  er->pPCache));. 
2f4f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f510 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2f520 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
2f530 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ED );.        go
2f540 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2f550 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2f560 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
2f570 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
2f580 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2f590 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
2f5a0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
2f5b0 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  is not the same 
2f5c0 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61  size as the data
2f5d0 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20  base image,.    
2f5e0 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61    ** then use pa
2f5f0 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20  ger_truncate to 
2f600 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74  grow or shrink t
2f610 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20  he file here..  
2f620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2f630 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21   pPager->dbSize!
2f640 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
2f650 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50  ize ){.        P
2f660 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65  gno nNew = pPage
2f670 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61  r->dbSize - (pPa
2f680 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47  ger->dbSize==PAG
2f690 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2f6a0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  r));.        ass
2f6b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2f6c0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
2f6d0 49 56 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72  IVE );.        r
2f6e0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
2f6f0 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29  te(pPager, nNew)
2f700 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2f720 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2f730 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  one_exit;.      
2f740 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69  }.  .      /* Fi
2f750 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20  nally, sync the 
2f760 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2f770 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  /.      if( !pPa
2f780 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21  ger->noSync && !
2f790 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
2f7a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f7b0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
2f7c0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
2f7d0 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ags);.      }.  
2f7e0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
2f7f0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2f800 65 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er)).    }..    
2f810 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2f820 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
2f830 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  }..commit_phase_
2f840 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  one_exit:.  retu
2f850 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2f860 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
2f870 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
2f880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f890 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65   has been comple
2f8a0 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20  tely.** updated 
2f8b0 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
2f8c0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
2f8d0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2f8e0 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79  action and.** sy
2f8f0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68  nced to disk. Th
2f900 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
2f910 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74  till exists in t
2f920 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
2f930 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69  ** though, and i
2f940 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
2f950 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
2f960 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61   it will eventua
2f970 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61  lly.** be used a
2f980 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
2f990 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
2f9a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
2f9b0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2f9c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2f9d0 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2f9e0 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20  al file, either 
2f9f0 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a  by deleting, .**
2fa00 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70   truncating or p
2fa10 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67  artially zeroing
2fa20 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20   it, so that it 
2fa30 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a  cannot be used .
2fa40 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e  ** for hot-journ
2fa50 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63  al rollback. Onc
2fa60 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74  e this is done t
2fa70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2fa80 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79  s.** irrevocably
2fa90 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2faa0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2fab0 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
2fac0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2fad0 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ed and the pager
2fae0 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74  .** moves into t
2faf0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2fb00 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2fb10 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2fb20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fb30 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2fb40 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
2fb50 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2fb60 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2fb70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2fb80 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2fb90 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2fba0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
2fbb0 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20  lled if a prior 
2fbc0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
2fbd0 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20  ed..  ** But if 
2fbe0 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67  (due to a coding
2fbf0 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65   error elsewhere
2fc00 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20   in the system) 
2fc10 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a  it does get.  **
2fc20 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65   called, just re
2fc30 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72  turn the same er
2fc40 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74  ror code without
2fc50 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
2fc60 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2fc70 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2fc80 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
2fc90 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
2fca0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2fcb0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2fcc0 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72  led if the pager
2fcd0 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65   is not in at le
2fce0 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52  ast.  ** PAGER_R
2fcf0 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41  ESERVED state. A
2fd00 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65  nd indeed SQLite
2fd10 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73   never does this
2fd20 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a  . But it is.  **
2fd30 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68   nice to have th
2fd40 69 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73  is defensive tes
2fd50 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20  t here anyway.. 
2fd60 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2fd70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
2fd80 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20  GER_RESERVED) ) 
2fd90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2fda0 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70  ROR;..  /* An op
2fdb0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74  timization. If t
2fdc0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2fdd0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
2fde0 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a  ified during.  *
2fdf0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2fe00 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  on, the pager is
2fe10 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2fe20 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69  usive-mode and i
2fe30 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72  s.  ** using per
2fe40 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  sistent journals
2fe50 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2fe60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2fe70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2fe80 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2fe90 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
2fea0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ly contains a si
2feb0 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  ngle journal .  
2fec0 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74  ** header with t
2fed0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65  he nRec field se
2fee0 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20  t to 0. If such 
2fef0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65  a journal is use
2ff00 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  d as.  ** a hot-
2ff10 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68  journal during h
2ff20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2ff30 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77  ack, 0 changes w
2ff40 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a  ill be made.  **
2ff50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2ff60 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20   file. So there 
2ff70 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65  is no need to ze
2ff80 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  ro the journal .
2ff90 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e    ** header. Sin
2ffa0 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
2ffb0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2ffc0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  e, there is no n
2ffd0 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70  eed.  ** to drop
2ffe0 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65   any locks eithe
2fff0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  r..  */.  if( pP
30000 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
30010 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
30020 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
30030 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
30040 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
30050 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
30060 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
30070 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
30080 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
30090 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
300a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
300b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
300c0 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
300d0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
300e0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
300f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
30100 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
30110 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
30120 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
30130 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
30140 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
30150 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
30160 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
30170 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
30180 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
30190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
301a0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
301b0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
301c0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
301d0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
301e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
301f0 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
30200 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
30210 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
30220 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
30230 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
30240 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
30250 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
30260 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
30270 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
30280 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
30290 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
302a0 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
302b0 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
302c0 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
302d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
302e0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
302f0 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
30300 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
30310 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
30320 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
30330 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
30340 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
30350 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
30360 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
30370 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
30380 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
30390 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
303a0 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
303b0 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
303c0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
303d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
303e0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
303f0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
30400 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
30410 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
30420 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
30430 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
30440 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
30450 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
30460 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
30470 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
30480 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
30490 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
304a0 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
304b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
304c0 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
304d0 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
304e0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
304f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
30500 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
30510 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
30520 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
30530 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
30540 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
30550 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
30560 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cussful, also at
30570 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
30580 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
30590 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
305a0 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
305b0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
305c0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
305d0 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
305e0 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
305f0 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
30600 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
30610 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
30620 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
30630 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
30640 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
30650 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30660 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
30670 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
30680 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
30690 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
306a0 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
306b0 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
306c0 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
306d0 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
306e0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
306f0 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
30700 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
30710 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
30720 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
30730 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
30740 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
30750 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
30760 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
30770 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
30780 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
30790 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
307a0 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
307b0 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
307c0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
307d0 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
307e0 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
307f0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
30800 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
30810 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
30820 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
30830 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
30840 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
30850 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
30860 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
30870 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
30880 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
30890 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
308a0 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
308b0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
308c0 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
308d0 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
308e0 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
308f0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
30900 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
30910 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
30920 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
30930 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
30940 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
30950 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
30960 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30970 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
30980 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30990 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
309a0 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
309b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
309c0 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 70 61  ger)));.  if( pa
309d0 67 65 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72  gerUseLog(pPager
309e0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  ) ){.    int rc2
309f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
30a00 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
30a10 28 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49  (pPager, SAVEPOI
30a20 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29  NT_ROLLBACK, -1)
30a30 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
30a40 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
30a50 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
30a60 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
30a70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30a80 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
30a90 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
30aa0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
30ab0 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
30ac0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72  r->jfd) ){.    r
30ad0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
30ae0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
30af0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
30b00 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
30b10 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
30b20 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
30b30 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
30b40 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
30b50 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
30b60 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
30b70 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
30b80 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
30b90 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
30ba0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
30bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
30bc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
30bd0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
30be0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
30bf0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
30c00 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
30c10 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
30c20 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
30c30 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
30c40 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
30c50 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
30c60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30c70 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
30c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
30c90 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
30ca0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
30cb0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
30cc0 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
30cd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
30ce0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
30cf0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
30d00 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
30d10 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
30d20 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
30d30 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
30d40 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
30d50 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
30d60 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
30d70 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
30d80 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
30d90 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
30da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
30db0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
30dc0 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
30dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30de0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
30df0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
30e00 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
30e10 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
30e20 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
30e30 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
30e40 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
30e50 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
30e60 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
30e70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30e80 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30e90 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
30ea0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
30eb0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
30ec0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
30ed0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
30ee0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
30ef0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30f00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
30f10 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
30f20 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
30f30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
30f40 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20  the approximate 
30f50 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
30f60 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  of memory curren
30f70 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  tly.** used by t
30f80 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73  he pager and its
30f90 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68   associated cach
30fa0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
30fb0 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61  3PagerMemUsed(Pa
30fc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30fd0 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20  int perPageSize 
30fe0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
30ff0 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ze + pPager->nEx
31000 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75  tra + 20;.  retu
31010 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73  rn perPageSize*s
31020 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
31030 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
31040 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20 20  Cache).         
31050 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f    + sqlite3Mallo
31060 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  cSize(pPager);.}
31070 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
31080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
31090 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
310a0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
310b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
310c0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44  erPageRefcount(D
310d0 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  bPage *pPage){. 
310e0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
310f0 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
31100 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66  t(pPage);.}..#if
31110 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
31120 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
31130 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
31140 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
31150 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
31160 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
31170 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
31180 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
31190 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
311a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
311b0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
311c0 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20  PCache);.  a[1] 
311d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  = sqlite3PcacheP
311e0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
311f0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32  >pPCache);.  a[2
31200 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
31210 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eGetCachesize(pP
31220 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
31230 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
31240 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28  >dbSizeValid ? (
31250 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53  int) pPager->dbS
31260 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d  ize : -1;.  a[4]
31270 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
31280 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
31290 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
312a0 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
312b0 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
312c0 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
312d0 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
312e0 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
312f0 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
31300 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
31310 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
31320 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
31330 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
31340 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
31350 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
31360 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
31370 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
31380 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
31390 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
313a0 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a  urn MEMDB;.}../*
313b0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
313c0 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
313d0 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
313e0 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66  epoints open. If
313f0 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75   there are.** cu
31400 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61  rrently less tha
31410 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70  n nSavepoints op
31420 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e  en, then open on
31430 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
31440 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ints.** to make 
31450 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  up the differenc
31460 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  e. If the number
31470 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69   of savepoints i
31480 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75  s already.** equ
31490 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74  al to nSavepoint
314a0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
314b0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
314c0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
314d0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
314e0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
314f0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  M is returned. I
31500 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
31510 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
31520 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ing the sub-jour
31530 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61  nal file, then a
31540 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
31550 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
31560 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
31570 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
31580 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
31590 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
315a0 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70  ager, int nSavep
315b0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
315c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
315f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72  e */.  int nCurr
31600 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  ent = pPager->nS
31610 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
31620 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62   /* Current numb
31630 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
31640 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65   */..  if( nSave
31650 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26  point>nCurrent &
31660 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
31670 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
31680 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316a0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
316b0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
316c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
316d0 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  aNew;           
316e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50          /* New P
316f0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
31700 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
31710 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
31740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
31750 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
31760 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
31770 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
31780 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
31790 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f  eturn rc;..    /
317a0 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
317b0 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
317c0 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
317d0 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
317e0 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
317f0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
31800 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
31810 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
31820 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
31830 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
31840 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
31850 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
31860 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
31870 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
31880 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
31890 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
318a0 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
318b0 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
318c0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
318d0 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
318e0 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
318f0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
31900 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
31910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
31920 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
31930 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
31940 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
31950 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
31960 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
31970 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
31980 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
31990 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61   = aNew;.    pPa
319a0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
319b0 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20  = nSavepoint;.. 
319c0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
319d0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
319e0 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
319f0 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
31a00 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
31a10 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
31a20 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
31a30 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
31a40 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 69  = nPage;.      i
31a50 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
31a60 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
31a70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
31a80 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
31a90 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
31aa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
31ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31ac0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
31ad0 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
31ae0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
31af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
31b00 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
31b10 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
31b20 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
31b30 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
31b40 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
31b50 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 20  eate(nPage);.   
31b60 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d     if( !aNew[ii]
31b70 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  .pInSavepoint ){
31b80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
31b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
31ba0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
31bb0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
31bc0 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
31bd0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
31be0 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63  pened. */.    rc
31bf0 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
31c00 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  l(pPager);.    a
31c10 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
31c20 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 3b  straint(pPager);
31c30 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
31c40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
31c50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
31c60 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
31c70 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d  or release (comm
31c80 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74 2e  it) a savepoint.
31c90 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
31ca0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72 20  t to release or 
31cb0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f  rollback need no
31cc0 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72 65  t be the most re
31cd0 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74  cently .** creat
31ce0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ed savepoint..**
31cf0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
31d00 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
31d10 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
31d20 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
31d30 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
31d40 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
31d50 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
31d60 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
31d70 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
31d80 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
31d90 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
31da0 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
31db0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
31dc0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
31dd0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
31de0 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74 68  ccurred since th
31df0 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
31e00 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
31e10 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76  d..**.** The sav
31e20 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61  epoint to rollba
31e30 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69 73  ck or release is
31e40 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
31e50 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61  arameter .** iSa
31e60 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65  vepoint. A value
31e70 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f   of 0 means to o
31e80 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f 75  perate on the ou
31e90 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
31ea0 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74 20  t.** (the first 
31eb0 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c 75  created). A valu
31ec0 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61 76  e of (Pager.nSav
31ed0 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20  epoint-1) means 
31ee0 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68  operate.** on th
31ef0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
31f00 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
31f10 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e 74  t. If iSavepoint
31f20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
31f30 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76 65  .** (Pager.nSave
31f40 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74  point-1), then t
31f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31f60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
31f70 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  f a negative val
31f80 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ue is passed to 
31f90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
31fa0 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
31fb0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
31fc0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  s rolled back. T
31fd0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
31fe0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   to calling .** 
31ff0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
32000 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20 74  back() because t
32010 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
32020 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a  s not terminate.
32030 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
32040 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  on or unlock the
32050 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a 75   database, it ju
32060 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65 20  st restores the 
32070 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
32080 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
32090 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
320a0 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  te. .**.** In an
320b0 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65  y case, all save
320c0 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69  points with an i
320d0 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
320e0 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  n iSavepoint .**
320f0 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e 20   are destroyed. 
32100 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
32110 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  ease operation (
32120 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
32130 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20  LEASE),.** then 
32140 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70  savepoint iSavep
32150 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65 73  oint is also des
32160 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  troyed..**.** Th
32170 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
32180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
32190 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79 20  MEM if a memory 
321a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
321b0 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72  ,.** or an IO er
321c0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 49  ror code if an I
321d0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
321e0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  hile rolling bac
321f0 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  k a .** savepoin
32200 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73 20  t. If no errors 
32210 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
32220 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
32230 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67   .int sqlite3Pag
32240 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  erSavepoint(Page
32250 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f  r *pPager, int o
32260 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
32270 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
32280 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
32290 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
322a0 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
322b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
322c0 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  BACK );.  assert
322d0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
322e0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
322f0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20  _ROLLBACK );..  
32300 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70  if( iSavepoint<p
32310 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
32320 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  t ){.    int ii;
32330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32340 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
32350 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77   */.    int nNew
32360 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
32370 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e  mber of remainin
32380 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66 74  g savepoints aft
32390 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a  er this op. */..
323a0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
323b0 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65 70  t how many savep
323c0 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c  oints will still
323d0 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65 72   be active after
323e0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65   this.    ** ope
323f0 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68  ration. Store th
32400 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77  is value in nNew
32410 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73 6f  . Then free reso
32420 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  urces associated
32430 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e   .    ** with an
32440 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61  y savepoints tha
32450 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 20  t are destroyed 
32460 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
32470 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e  n..    */.    nN
32480 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74 20  ew = iSavepoint 
32490 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  + (( op==SAVEPOI
324a0 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20 30  NT_RELEASE ) ? 0
324b0 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 1);.    for(i
324c0 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65  i=nNew; ii<pPage
324d0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
324e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
324f0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
32500 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
32510 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
32520 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
32530 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
32540 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20  int = nNew;..   
32550 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
32560 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20   release of the 
32570 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
32580 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20  int, truncate . 
32590 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
325a0 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79  urnal to zero by
325b0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
325c0 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
325d0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b  POINT_RELEASE ){
325e0 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3d  .      if( nNew=
325f0 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  =0 && isOpen(pPa
32600 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
32610 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72        /* Only tr
32620 75 6e 63 61 74 65 20 69 66 20 69 74 20 69 73 20  uncate if it is 
32630 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62  an in-memory sub
32640 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20  -journal. */.   
32650 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
32660 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
32670 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
32680 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32690 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
326a0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b  Pager->sjfd, 0);
326b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
326c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
326d0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
326e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53        pPager->nS
326f0 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  ubRec = 0;.     
32700 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20   }.    }.    /* 
32710 45 6c 73 65 20 74 68 69 73 20 69 73 20 61 20 72  Else this is a r
32720 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
32730 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20  n, playback the 
32740 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
32750 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  int..    ** If t
32760 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69  his is a temp-fi
32770 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  le, it is possib
32780 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  le that the jour
32790 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20  nal file has.   
327a0 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
327b0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
327c0 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65   case there have
327d0 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
327e0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
327f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f  atabase file, so
32800 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70   the playback op
32810 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73  eration can be s
32820 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
32830 20 20 20 65 6c 73 65 20 69 66 28 20 70 61 67 65     else if( page
32840 72 55 73 65 4c 6f 67 28 70 50 61 67 65 72 29 20  rUseLog(pPager) 
32850 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
32860 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
32870 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
32880 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e  pSavepoint = (nN
32890 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72  ew==0)?0:&pPager
328a0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65  ->aSavepoint[nNe
328b0 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  w-1];.      rc =
328c0 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
328d0 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20  vepoint(pPager, 
328e0 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  pSavepoint);.   
328f0 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51     assert(rc!=SQ
32900 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20  LITE_DONE);.    
32910 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  }.  .  }.  retur
32920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
32930 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
32940 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
32950 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
32960 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
32970 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
32980 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
32990 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
329a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
329b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
329c0 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
329d0 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
329e0 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
329f0 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
32a00 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
32a10 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
32a20 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
32a30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
32a40 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
32a50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32a60 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
32a70 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
32a80 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
32a90 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
32aa0 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
32ab0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
32ac0 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
32ad0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
32ae0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
32af0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
32b00 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
32b10 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
32b20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
32b30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
32b40 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
32b50 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
32b60 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
32b70 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
32b80 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
32b90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
32ba0 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
32bb0 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
32bc0 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
32bd0 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
32be0 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
32bf0 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
32c00 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
32c10 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
32c20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32c30 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
32c40 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
32c50 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
32c60 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ODEC./*.** Set o
32c70 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63  r retrieve the c
32c80 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
32c90 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ger.*/.static vo
32ca0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
32cb0 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
32cc0 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
32cd0 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
32ce0 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
32cf0 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
32d00 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
32d10 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f  *,int,int),.  vo
32d20 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
32d30 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20  (void*),.  void 
32d40 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28  *pCodec.){.  if(
32d50 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
32d60 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
32d70 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
32d80 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67  >pCodec);.  pPag
32d90 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70 50 61  er->xCodec = pPa
32da0 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a  ger->memDb ? 0 :
32db0 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
32dc0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
32dd0 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68  g = xCodecSizeCh
32de0 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ng;.  pPager->xC
32df0 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65  odecFree = xCode
32e00 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d  cFree;.  pPager-
32e10 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63  >pCodec = pCodec
32e20 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53  ;.  pagerReportS
32e30 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73  ize(pPager);.}.s
32e40 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69  tatic void *sqli
32e50 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63  te3PagerGetCodec
32e60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
32e70 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
32e80 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64  ->pCodec;.}.#end
32e90 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
32ea0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32eb0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
32ec0 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
32ed0 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
32ee0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
32ef0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
32f00 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
32f10 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
32f20 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
32f30 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
32f40 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
32f50 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
32f60 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
32f70 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
32f80 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
32f90 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  ly located at pg
32fa0 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
32fb0 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
32fc0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
32fd0 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
32fe0 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
32ff0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
33000 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
33010 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
33020 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
33030 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
33040 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
33050 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
33060 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
33070 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
33080 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
33090 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
330a0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
330b0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
330c0 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
330d0 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
330e0 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
330f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
33100 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
33110 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
33120 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
33130 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
33140 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
33150 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
33160 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
33170 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
33180 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
33190 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
331a0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
331b0 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
331c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72  *.** If the four
331d0 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43  th argument, isC
331e0 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65  ommit, is non-ze
331f0 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
33200 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d  ge is being.** m
33210 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oved as part of 
33220 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67  a database reorg
33230 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62  anization just b
33240 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
33250 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69  ction .** is bei
33260 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e  ng committed. In
33270 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
33280 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
33290 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  t the database p
332a0 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65  age .** pPg refe
332b0 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62  rs to will not b
332c0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61  e written to aga
332d0 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
332e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
332f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33300 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
33310 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
33320 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
33330 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
33340 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  s. Otherwise, it
33350 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
33360 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
33370 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
33380 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
33390 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
333a0 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
333b0 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
333c0 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  PgOld;          
333d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
333e0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
333f0 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  en. */.  Pgno ne
33400 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20  edSyncPgno = 0; 
33410 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c        /* Old val
33420 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c  ue of pPg->pgno,
33430 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75   if sync is requ
33440 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ired */.  int rc
33450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33460 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
33470 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   code */.  Pgno 
33480 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20  origPgno;       
33490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
334a0 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d  riginal page num
334b0 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ber */..  assert
334c0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
334d0 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20  ..  /* In order 
334e0 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  to be able to ro
334f0 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65  llback, an in-me
33500 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6d 75  mory database mu
33510 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  st journal.  ** 
33520 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
33530 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a  moving from..  *
33540 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
33550 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33560 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
33570 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
33580 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
33590 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
335a0 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64  being moved is d
335b0 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74  irty and has not
335c0 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74   been saved by t
335d0 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73  he latest.  ** s
335e0 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73  avepoint, then s
335f0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
33600 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
33610 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20  page into the . 
33620 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
33630 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71  now. This is req
33640 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
33650 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
33660 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  enario:.  **.  *
33670 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
33680 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
33690 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e X, then modify
336a0 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20   it in memory>. 
336b0 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
336c0 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20  T one;.  **     
336d0 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74    <Move page X t
336e0 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20  o location Y>.  
336f0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
33700 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  TO one;.  **.  *
33710 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65  * If page X were
33720 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
33730 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
33740 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  here, it would n
33750 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69  ot.  ** be possi
33760 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69  ble to restore i
33770 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e  ts contents when
33780 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
33790 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74  O one".  ** stat
337a0 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72  ement were is pr
337b0 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  ocessed..  **.  
337c0 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  ** subjournalPag
337d0 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  e() may need to 
337e0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  allocate space t
337f0 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  o store pPg->pgn
33800 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20  o into.  ** one 
33810 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
33820 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20  t bitvecs. This 
33830 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68  is the reason th
33840 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
33850 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
33860 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20  TE_NOMEM..  */. 
33870 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
33880 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20 20 26  PGHDR_DIRTY.   &
33890 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
338a0 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
338b0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
338c0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
338d0 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
338e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
338f0 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
33900 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
33910 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
33920 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
33930 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
33940 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
33950 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
33960 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
33970 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
33980 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
33990 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
339a0 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
339b0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
339c0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
339d0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
339e0 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
339f0 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
33a00 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
33a10 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
33a20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
33a30 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
33a40 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
33a50 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
33a60 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
33a70 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
33a80 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
33a90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
33aa0 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
33ab0 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
33ac0 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
33ad0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
33ae0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
33af0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
33b00 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
33b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
33b20 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
33b30 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
33b40 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
33b50 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
33b60 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
33b70 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
33b80 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
33b90 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
33ba0 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  igSize );.    as
33bb0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
33bc0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
33bd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33be0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
33bf0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
33c00 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
33c10 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
33c20 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
33c30 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
33c40 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
33c50 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
33c60 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
33c70 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
33c80 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
33c90 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
33ca0 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
33cb0 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
33cc0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
33cd0 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
33ce0 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
33cf0 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
33d00 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
33d10 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
33d20 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
33d30 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
33d40 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
33d50 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
33d60 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
33d70 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
33d80 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
33d90 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66 28 20  _SYNC);.    if( 
33da0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
33db0 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61 72 64  * Do not discard
33dc0 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e 20 69   pages from an i
33dd0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
33de0 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67 68 74  e since we might
33df0 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74  .      ** need t
33e00 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72  o rollback later
33e10 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74 68 65  .  Just move the
33e20 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74 68 65   page out of the
33e30 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61   way. */.      a
33e40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
33e50 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
33e60 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
33e70 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20 70 50  eMove(pPgOld, pP
33e80 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b  ager->dbSize+1);
33e90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33ea0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
33eb0 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  rop(pPgOld);.   
33ec0 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67   }.  }..  origPg
33ed0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
33ee0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
33ef0 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
33f00 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
33f10 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
33f20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
33f30 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
33f40 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
33f50 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
33f60 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
33f70 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
33f80 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
33f90 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
33fa0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
33fb0 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
33fc0 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
33fd0 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
33fe0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
33ff0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
34000 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
34010 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
34020 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
34030 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
34040 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
34050 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
34060 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
34070 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
34080 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
34090 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
340a0 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
340b0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
340c0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
340d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
340e0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
340f0 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
34100 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
34110 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
34120 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
34130 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
34140 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
34150 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
34160 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
34170 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
34180 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
34190 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
341a0 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
341b0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
341c0 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
341d0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
341e0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
341f0 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
34200 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
34210 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
34220 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
34230 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
34240 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
34250 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
34260 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
34270 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
34280 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34290 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
342a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
342b0 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
342c0 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
342d0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
342e0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
342f0 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
34300 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
34310 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
34320 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
34330 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34340 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
34350 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
34360 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
34370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34380 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
34390 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
343a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
343b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
343c0 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a  pTmpSpace!=0 );.
343d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
343e0 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
343f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
34400 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61  eedSyncPgno, pPa
34410 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
34420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
34430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
34440 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
34450 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
34460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
34470 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
34480 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
34490 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
344a0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
344b0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
344c0 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
344d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
344e0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
344f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  }..  /*.  ** For
34500 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
34510 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72  tabase, make sur
34520 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
34530 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20  age continues.  
34540 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20  ** to exist, in 
34550 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
34560 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f  tion needs to ro
34570 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20 70 50  ll back.  Use pP
34580 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74 68 65  gOld.  ** as the
34590 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 73   original page s
345a0 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c 72 65  ince it has alre
345b0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
345c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  ed..  */.  if( M
345d0 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c 69  EMDB ){.    sqli
345e0 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
345f0 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b  gOld, origPgno);
34600 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
34610 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a  rUnref(pPgOld);.
34620 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
34630 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
34640 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
34650 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
34660 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
34670 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
34680 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
34690 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
346a0 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  e *pPg){.  asser
346b0 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c  t( pPg->nRef>0 |
346c0 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d  | pPg->pPager->m
346d0 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e  emDb );.  return
346e0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a   pPg->pData;.}..
346f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
34700 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
34710 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
34720 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
34730 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
34740 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
34750 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
34760 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
34770 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
34780 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
34790 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72 61 3b  urn pPg->pExtra;
347a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
347b0 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
347c0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
347d0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
347e0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
347f0 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
34800 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
34810 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
34820 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
34830 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
34840 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
34850 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
34860 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
34870 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
34880 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
34890 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
348a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
348b0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
348c0 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
348d0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
348e0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
348f0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
34900 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
34910 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
34920 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
34930 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
34940 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
34950 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
34960 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
34970 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
34980 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
34990 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
349a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
349b0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
349c0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
349d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
349e0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
349f0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
34a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
34a10 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
34a20 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
34a30 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
34a40 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
34a50 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
34a60 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
34a70 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
34a80 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
34a90 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
34aa0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
34ab0 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f  veMode = (u8)eMo
34ac0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
34ad0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
34ae0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
34af0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
34b00 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66  e journal-mode f
34b10 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
34b20 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
34b30 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a  ust be one of:.*
34b40 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  *.**    PAGER_JO
34b50 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
34b60 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
34b70 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a  NALMODE_DELETE.*
34b80 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
34b90 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
34ba0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
34bb0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
34bc0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
34bd0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20  NALMODE_OFF.**  
34be0 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
34bf0 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20  ODE_MEMORY.**   
34c00 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
34c10 44 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  DE_WAL.**.** If 
34c20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
34c30 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
34c40 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  n the journal_mo
34c50 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
34c60 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66  .** value specif
34c70 69 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67  ied if the chang
34c80 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54  e is allowed.  T
34c90 68 65 20 63 68 61 6e 67 65 20 69 73 20 64 69 73  he change is dis
34ca0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74  allowed.** for t
34cb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61  he following rea
34cc0 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  sons:.**.**   * 
34cd0 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   An in-memory da
34ce0 74 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20  tabase can only 
34cf0 68 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  have its journal
34d00 5f 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46  _mode set to _OF
34d10 46 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45  F.**      or _ME
34d20 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  MORY..**.**   * 
34d30 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   The journal mod
34d40 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61  e may not be cha
34d50 6e 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61  nged while a tra
34d60 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
34d70 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ve..**.** The re
34d80 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20  turned indicate 
34d90 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
34da0 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a  sibly updated) j
34db0 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
34dc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
34dd0 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
34de0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
34df0 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
34e00 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
34e10 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
34e20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
34e30 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
34e40 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20  NALMODE_DELETE. 
34e50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
34e60 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
34e70 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
34e80 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
34e90 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
34ea0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
34eb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
34ec0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
34ed0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
34ee0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
34ef0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
34f00 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
34f10 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
34f20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
34f30 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73  E_MEMORY );.  as
34f40 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
34f50 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
34f60 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
34f70 30 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  0.   && (pPager-
34f80 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
34f90 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  eMode!=PAGER_JOU
34fa0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20  RNALMODE_WAL).  
34fb0 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65   && (!MEMDB || e
34fc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
34fd0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 7c 7c  NALMODE_MEMORY||
34fe0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
34ff0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20  RNALMODE_OFF).  
35000 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d   && !pPager->dbM
35010 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20 28 21  odified.   && (!
35020 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
35030 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72  fd) || 0==pPager
35040 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20  ->journalOff).  
35050 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  ){.    if( isOpe
35060 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
35070 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
35080 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
35090 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  fd);.    }.    a
350a0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
350b0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
350c0 54 45 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20 20  TE & 1)==1 );.  
350d0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
350e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
350f0 53 49 53 54 20 26 20 31 29 3d 3d 31 20 29 3b 0a  SIST & 1)==1 );.
35100 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
35110 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
35120 45 4c 45 54 45 20 26 20 31 29 3d 3d 30 20 29 3b  ELETE & 1)==0 );
35130 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
35140 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
35150 4d 45 4d 4f 52 59 20 26 20 31 29 3d 3d 30 20 29  MEMORY & 1)==0 )
35160 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
35170 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
35180 5f 4f 46 46 20 26 20 31 29 3d 3d 30 20 29 3b 0a  _OFF & 1)==0 );.
35190 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
351a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 31  >journalMode & 1
351b0 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26  )==1 && (eMode &
351c0 20 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   1)==0.         
351d0 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  && !pPager->excl
351e0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
351f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
35200 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
35210 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
35220 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  l, 0);.    }..  
35230 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 50 41 47    if( eMode==PAG
35240 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
35250 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AL ){.      int 
35260 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 4c 6f  rc = pagerOpenLo
35270 67 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  g(pPager);.     
35280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
352a0 20 54 4f 44 4f 3a 20 54 68 65 20 65 72 72 6f 72   TODO: The error
352b0 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 6e 6f 74   code should not
352c0 20 6a 75 73 74 20 67 65 74 20 64 72 6f 70 70 65   just get droppe
352d0 64 20 68 65 72 65 2e 20 43 68 61 6e 67 65 20 0a  d here. Change .
352e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
352f0 74 6f 20 73 65 74 20 61 20 66 6c 61 67 20 74 6f  to set a flag to
35300 20 66 6f 72 63 65 20 74 68 65 20 6c 6f 67 20 74   force the log t
35310 6f 20 62 65 20 6f 70 65 6e 65 64 20 74 68 65 20  o be opened the 
35320 66 69 72 73 74 20 74 69 6d 65 0a 20 20 20 20 20  first time.     
35330 20 20 20 2a 2a 20 69 74 20 69 73 20 61 63 74 75     ** it is actu
35340 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 20  ally required.  
35350 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
35360 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
35370 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 20 20 20 20  ournalMode;.    
35380 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
35390 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
353a0 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
353b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
353c0 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  )pPager->journal
353d0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
353e0 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d  et/set the size-
353f0 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70  limit used for p
35400 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
35410 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  l files..**.** S
35420 65 74 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20  etting the size 
35430 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e  limit to -1 mean
35440 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e  s no limit is en
35450 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74  forced..** An at
35460 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c  tempt to set a l
35470 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61  imit smaller tha
35480 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n -1 is a no-op.
35490 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50  .*/.i64 sqlite3P
354a0 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c  agerJournalSizeL
354b0 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
354c0 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b  er, i64 iLimit){
354d0 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d  .  if( iLimit>=-
354e0 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 ){.    pPager-
354f0 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
35500 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a  t = iLimit;.  }.
35510 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
35520 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
35530 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
35540 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
35550 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63  the pPager->pBac
35560 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68  kup variable. Th
35570 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a  e backup module.
35580 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d  ** in backup.c m
35590 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e  aintains the con
355a0 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72  tent of this var
355b0 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75  iable. This modu
355c0 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70  le.** uses it op
355d0 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67  aquely as an arg
355e0 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
355f0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 29 20  BackupRestart() 
35600 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61  and.** sqlite3Ba
35610 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c  ckupUpdate() onl
35620 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61  y..*/.sqlite3_ba
35630 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61  ckup **sqlite3Pa
35640 67 65 72 42 61 63 6b 75 70 50 74 72 28 50 61 67  gerBackupPtr(Pag
35650 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
35660 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70  eturn &pPager->p
35670 42 61 63 6b 75 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Backup;.}../*.**
35680 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
35690 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
356a0 65 20 75 73 65 72 20 69 6e 76 6f 6b 65 73 20 22  e user invokes "
356b0 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
356c0 74 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  t"..*/.int sqlit
356d0 65 33 50 61 67 65 72 43 68 65 63 6b 70 6f 69 6e  e3PagerCheckpoin
356e0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
356f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
35700 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
35710 61 67 65 72 2d 3e 70 4c 6f 67 20 29 7b 0a 20 20  ager->pLog ){.  
35720 20 20 75 38 20 2a 7a 42 75 66 20 3d 20 28 75 38    u8 *zBuf = (u8
35730 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
35740 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  pace;.    rc = s
35750 71 6c 69 74 65 33 4c 6f 67 43 68 65 63 6b 70 6f  qlite3LogCheckpo
35760 69 6e 74 28 70 50 61 67 65 72 2d 3e 70 4c 6f 67  int(pPager->pLog
35770 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20  , pPager->fd, . 
35780 20 20 20 20 20 20 20 7a 42 75 66 2c 20 70 50 61         zBuf, pPa
35790 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
357a0 72 2c 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  r, pPager->pBusy
357b0 48 61 6e 64 6c 65 72 41 72 67 0a 20 20 20 20 29  HandlerArg.    )
357c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
357d0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
357e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
357f0 49 4f 20 2a 2f 0a                                IO */.