/ Hex Artifact Content
Login

Artifact 964c7862e1e27c543d2fff2e537ceadc4026c682:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2140: 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21   BTS_EXCLUSIVE)!
2150: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2160: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2170: 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
2180: 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20  Writer->db);.   
2190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
21a0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
21b0: 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49  E;.  }..  for(pI
21c0: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
21d0: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
21e0: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
21f0: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2200: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
2210: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
2220: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
2230: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
2240: 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63  t is a simplific
2250: 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a  ation of:.    **
2260: 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b  .    **   (eLock
2270: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20  ==WRITE_LOCK || 
2280: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2290: 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a  ITE_LOCK).    **
22a0: 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65  .    ** since we
22b0: 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c   know that if eL
22c0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c  ock==WRITE_LOCK,
22d0: 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63   then no other c
22e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  onnection.    **
22f0: 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54   may hold a WRIT
2300: 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61  E_LOCK on any ta
2310: 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ble in this file
2320: 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61   (since there ca
2330: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65  n.    ** only be
2340: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
2350: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
2360: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f  sert( pIter->eLo
2370: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2380: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
2390: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RITE_LOCK );.   
23a0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
23b0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
23c0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c  er->pBtree==p ||
23d0: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
23e0: 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  EAD_LOCK);.    i
23f0: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
2400: 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54  !=p && pIter->iT
2410: 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49  able==iTab && pI
2420: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
2430: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
2440: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
2450: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
2460: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
2470: 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d       if( eLock==
2480: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  WRITE_LOCK ){.  
2490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
24a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  =pBt->pWriter );
24b0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74  .        pBt->bt
24c0: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45  sFlags |= BTS_PE
24d0: 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20  NDING;.      }. 
24e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24f0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
2500: 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CACHE;.    }.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2520: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2530: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
2540: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
2550: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2560: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
2570: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
2580: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
2590: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
25a0: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
25b0: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
25c0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
25d0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
25e0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
25f0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
2600: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
2610: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2620: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66  on assumes the f
2630: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2640: 20 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66    (a) The specif
2650: 69 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74  ied Btree object
2660: 20 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20   p is connected 
2670: 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a  to a sharable.**
2680: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
2690: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
26a0: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20  Shared.sharable 
26b0: 66 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a  flag set), and.*
26c0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
26d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
26e0: 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68  s hold a lock th
26f0: 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20  at conflicts.** 
2700: 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72        with the r
2710: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69  equested lock (i
2720: 2e 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43  .e. querySharedC
2730: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2740: 68 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72  has.**       alr
2750: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2760: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51   and returned SQ
2770: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
2780: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2790: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63  urned if the loc
27a0: 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65  k is added succe
27b0: 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f  ssfully. SQLITE_
27c0: 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74  NOMEM .** is ret
27d0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
27e0: 63 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e  c attempt fails.
27f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2800: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
2810: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
2820: 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38   Pgno iTable, u8
2830: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
2840: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2850: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  t;.  BtLock *pLo
2860: 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b  ck = 0;.  BtLock
2870: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
2880: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2890: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
28a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
28b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65  ==READ_LOCK || e
28c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
28d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
28e0: 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db!=0 );..  /* 
28f0: 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  A connection wit
2900: 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  h the read-uncom
2910: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20  mitted flag set 
2920: 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74  will never try t
2930: 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20  o.  ** obtain a 
2940: 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20  read-lock using 
2950: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
2960: 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63  he only read-loc
2970: 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20  k obtained.  ** 
2980: 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  by a connection 
2990: 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  in read-uncommit
29a0: 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74  ted mode is on t
29b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
29c0: 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e   .  ** table, an
29d0: 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f  d that lock is o
29e0: 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65  btained in Btree
29f0: 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a  BeginTrans().  *
2a00: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28  /.  assert( 0==(
2a10: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  p->db->flags&SQL
2a20: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2a30: 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  ted) || eLock==W
2a40: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
2a50: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2a60: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2a70: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
2a80: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
2a90: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
2aa0: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
2ab0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
2ac0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
2ad0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
2ae0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
2af0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
2b00: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
2b10: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2b20: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
2b30: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
2b40: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
2b50: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
2b60: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
2b70: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
2b80: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
2b90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
2ba0: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
2bb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
2bc0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2bd0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
2be0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2bf0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
2c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2c20: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
2c30: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
2c40: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
2c50: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
2c60: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
2c70: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
2c80: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
2c90: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
2ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
2cb0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2cc0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
2cd0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
2ce0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
2cf0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
2d00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d20: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
2d30: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
2d40: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
2d50: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
2d60: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
2d70: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
2d80: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
2d90: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
2da0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
2db0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
2dc0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
2dd0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
2de0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2df0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
2e00: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
2e10: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
2e20: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
2e30: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
2e40: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
2e50: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
2e60: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
2e70: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
2e80: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
2e90: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
2ea0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
2eb0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
2ec0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
2ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ee0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2ef0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2f00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2f20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2f30: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
2f40: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
2f50: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
2f60: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
2f70: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2f80: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
2f90: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
2fa0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fc0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
2fd0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
2fe0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2ff0: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3000: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3010: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3020: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3030: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3040: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3050: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3060: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3070: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3080: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
3090: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
30a0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
30b0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
30c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
30e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
30f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3100: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3110: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3120: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3130: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3140: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3150: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3160: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3170: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3180: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
3190: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
31a0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
31b0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31c0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31d0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31e0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31f0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3200: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3210: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3220: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3230: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3240: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3250: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3260: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3270: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3280: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
32b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32c0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
32d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32e0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
32f0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3300: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3310: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3320: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3330: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3340: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3350: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3360: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3370: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3380: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
33b0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
33c0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33e0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33f0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3400: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3410: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3420: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3430: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3440: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3450: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3460: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3470: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3480: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3490: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
34a0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
34b0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
34c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
34d0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
34e0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
34f0: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3500: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3510: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3520: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3530: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3540: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3550: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3560: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3590: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
35a0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
35b0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
35c0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
35d0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
35e0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
35f0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3600: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3610: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3620: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3630: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3640: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3650: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3660: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3670: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3680: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3690: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
36a0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
36b0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
36c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
36d0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
36e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
36f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3700: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3710: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3720: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3730: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3740: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3750: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3760: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3770: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3780: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3790: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
37a0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
37b0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
37c0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
37d0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
37e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
37f0: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3800: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3810: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3820: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3830: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3840: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3850: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3870: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
3890: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
38a0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
38b0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
38c0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
38d0: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
38e0: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
38f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3900: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
3910: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
3920: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
3930: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3940: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
3950: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3960: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
3970: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
3980: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
3990: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
39a0: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
39b0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
39c0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
39d0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
39e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
39f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3a00: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3a10: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3a20: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3a30: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3a40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3a50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3a60: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3a70: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3a80: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3a90: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3aa0: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3ac0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3ad0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
3ae0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
3af0: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
3b00: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
3b10: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
3b20: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
3b30: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
3b40: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
3b50: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
3b60: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
3b70: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3b80: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
3b90: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
3ba0: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
3bb0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
3bc0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3bd0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
3be0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
3bf0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3c00: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
3c10: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
3c20: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
3c30: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
3c40: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
3c50: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
3c60: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
3c70: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
3c80: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
3c90: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
3ca0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3cb0: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
3cc0: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
3cd0: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
3ce0: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
3cf0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
3d00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
3d10: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
3d20: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3d40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
3d50: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34  o check */.  i64
3d60: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3d70: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3d80: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3d90: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3da0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3dd0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3e00: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3e30: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3e40: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3e50: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3e60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3e70: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3e80: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3e90: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3ea0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3eb0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3ec0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3ed0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3ee0: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
3ef0: 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  s when INCRBLOB 
3f00: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
3f10: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3f20: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3f30: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3f40: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3f50: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3f60: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3f70: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
3f80: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
3f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3fa0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
3fb0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
3fc0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
3fd0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
3fe0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
3ff0: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4000: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4010: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4020: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4030: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4040: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4050: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4060: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4070: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
4080: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
4090: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
40a0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
40b0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
40c0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
40d0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
40e0: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
40f0: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4100: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4110: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4120: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4130: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4140: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4150: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4160: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4170: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
4180: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
4190: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
41a0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
41b0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
41c0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
41d0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
41e0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
41f0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4200: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4210: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4220: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4230: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4240: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4250: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4260: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4270: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
4280: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4290: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
42a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
42b0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
42c0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
42d0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
42e0: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
42f0: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4300: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4310: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4320: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4330: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4340: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4350: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4360: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4370: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
4380: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
4390: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43a0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
43b0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
43c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
43d0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
43e0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
43f0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4400: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4410: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4420: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4430: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4440: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4450: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4460: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4470: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
4480: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
4490: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
44a0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
44b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
44c0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
44d0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
44e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
44f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4500: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4510: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4520: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4530: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4540: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4550: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4560: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4570: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4580: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
4590: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
45a0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
45b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
45c0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
45d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
45e0: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
45f0: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4600: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4610: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4620: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4630: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4640: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4650: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4660: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4670: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
4680: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
4690: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
46a0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
46b0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
46c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
46d0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
46e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
46f0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4700: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4710: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4720: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4730: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4740: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4750: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4760: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4770: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4780: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4790: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
47a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
47b0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
47c0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
47e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
47f0: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4800: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4810: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4820: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4830: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4840: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4850: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4860: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4870: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4880: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4890: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
48a0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
48b0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
48c0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
48d0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
48e0: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
48f0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4900: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4910: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4920: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4930: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4940: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4950: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4960: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4970: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4980: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4990: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
49a0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
49b0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
49c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
49d0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
49e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
49f0: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4a00: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a10: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4a20: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4a30: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4a40: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4a50: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4a70: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4a80: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4a90: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4aa0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4ab0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4ac0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4ad0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4ae0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4af0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4b00: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4b10: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4b20: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4b30: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
4b40: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
4b50: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4b60: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4b70: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4b80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4b90: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4ba0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4bb0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4bc0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4bd0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4bf0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4c00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4c10: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4c20: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4c30: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4c40: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4c50: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4c60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4c70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4c80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4c90: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4ca0: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4cb0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4cc0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4cd0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4ce0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4cf0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4d00: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4d10: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4d20: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4d30: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4d40: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4d50: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4d60: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4d70: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4d80: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4d90: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4da0: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4db0: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4dc0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4dd0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4de0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4df0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4e00: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4e10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4e20: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4e30: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4e40: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4e50: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4e60: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4e70: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4e80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4e90: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4ea0: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4eb0: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4ec0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4ee0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4f10: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4f20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4f40: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4f50: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4f60: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4f70: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4f80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4f90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4fa0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4fb0: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4fc0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4fd0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4fe0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4ff0: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
5000: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
5010: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5020: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
5030: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
5040: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
5050: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
5060: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
5070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5080: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
5090: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
50a0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
50b0: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
50c0: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
50d0: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
50e0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
50f0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
5100: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5110: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
5120: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
5130: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
5140: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
5150: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5160: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5170: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5180: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5190: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
51a0: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
51b0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
51c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
51d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
51e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
51f0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
5200: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
5210: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
5220: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
5230: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
5240: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
5250: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5260: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5270: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5280: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5290: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
52a0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
52b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
52c0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
52d0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
52e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
52f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5310: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
5320: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
5330: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5340: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5350: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5360: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5370: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5380: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5390: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
53a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
53b0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
53c0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
53d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
53e0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
53f0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
5400: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
5410: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
5420: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
5430: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5440: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5450: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5460: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5470: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5480: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5490: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
54a0: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
54b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
54c0: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
54d0: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
54e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
54f0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
5500: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
5510: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
5520: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
5530: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5540: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5550: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5560: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5570: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5580: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5590: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
55a0: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
55b0: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
55c0: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
55d0: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
55e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
55f0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
5600: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
5610: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5620: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
5630: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5640: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5650: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5660: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5670: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5680: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5690: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
56a0: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
56b0: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
56c0: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
56d0: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
56e0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
56f0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5700: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
5720: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
5730: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5740: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5750: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5760: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5770: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5790: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
57a0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
57b0: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
57c0: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
57d0: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
57e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
57f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5800: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5810: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5820: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5830: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
5840: 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
5850: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5860: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
5870: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
5880: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5890: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
58a0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
58b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
58c0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
58d0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
58e0: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
58f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
5900: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
5910: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
5920: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
5930: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
5940: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
5950: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5960: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
5970: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
5980: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
5990: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59a0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
59b0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
59c0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
59d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
59e0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
59f0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5a00: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5a20: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5a30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
5a40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
5a50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5a60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
5a70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
5a80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
5a90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
5aa0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
5ab0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5ac0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
5ad0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
5ae0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
5af0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
5b00: 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  r->skipNext);.  
5b10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5b30: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5b40: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
5b50: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
5b60: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5b70: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5b90: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
5ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5bb0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5bc0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5bd0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5be0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5bf0: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5c00: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5c10: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5c20: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5c40: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5c50: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5c60: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5c70: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
5c80: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
5c90: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
5ca0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
5cb0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
5cc0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
5cd0: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
5ce0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
5cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d00: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
5d10: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
5d20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d30: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
5d40: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
5d50: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
5d60: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
5d70: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
5d80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
5da0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
5db0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
5dc0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
5dd0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
5de0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
5df0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
5e00: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e10: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5e20: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
5e30: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
5e40: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
5e50: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b  ->skipNext!=0 ){
5e60: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5e80: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
5e90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5ea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
5eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5ec0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
5ed0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
5ee0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5ef0: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5f00: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5f10: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5f20: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5f30: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5f40: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5f50: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5f60: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
5f70: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
5f80: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
5f90: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
5fa0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
5fb0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
5fc0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
5fd0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
5fe0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
5ff0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
6000: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
6010: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
6020: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
6030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6040: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
6050: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
6060: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
6070: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
6080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
60a0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
60b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
60c0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
60d0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
60e0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
60f0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
6100: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6110: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
6120: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
6130: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
6140: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
6150: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
6160: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
6170: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
6180: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
6190: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
61a0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
61c0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
61d0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
61e0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
61f0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
6200: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
6210: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
6220: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
6230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
6240: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
6250: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
6260: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
6270: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
6280: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
6290: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
62a0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
62b0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
62c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
62d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
62e0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
62f0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
6300: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
6310: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
6320: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
6330: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
6340: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6350: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
6360: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
6370: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
6380: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
6390: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
63a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
63b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
63c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
63d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
63e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
63f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6400: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6410: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
6420: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
6430: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
6440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6450: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6460: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
6470: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6480: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
6490: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
64a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
64b0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
64c0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
64d0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
64e0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
64f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6500: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6510: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
6520: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6530: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6540: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6550: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
6560: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
6570: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6580: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6590: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
65a0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
65b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
65c0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
65d0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
65e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
65f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6600: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6610: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
6620: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6630: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6640: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6650: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
6660: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6670: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6680: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
6690: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
66a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
66b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
66c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
66d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
66e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
66f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
6700: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
6710: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
6720: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
6730: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
6740: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
6750: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
6760: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
6770: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
6790: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
67a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
67b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
67c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
67d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
67e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
67f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6800: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
6810: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
6820: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
6830: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
6850: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
6860: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
6870: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
6880: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
6890: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
68a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
68b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
68c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
68d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
68e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
68f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
6900: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
6910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6920: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
6930: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6940: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
6950: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
6960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6970: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
6980: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6990: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
69a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
69b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
69c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
69d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
69e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
69f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6a10: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
6a20: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
6a30: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
6a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6a50: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6a60: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
6a70: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6a80: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6a90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6aa0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6ab0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6ac0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
6ad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6ae0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6af0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6b00: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6b10: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
6b20: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
6b30: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
6b40: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
6b50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
6b60: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6b90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6ba0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6bb0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
6bd0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6be0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6bf0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6c00: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6c10: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6c20: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6c30: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6c40: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6c50: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6c60: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6c80: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
6c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
6ca0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
6cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6cc0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
6cd0: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6ce0: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
6cf0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6d00: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6d10: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6d20: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
6d30: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
6d40: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
6d50: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
6d60: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
6d70: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
6d80: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
6d90: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
6da0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
6db0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
6dc0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6dd0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
6de0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6df0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
6e00: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
6e10: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
6e20: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
6e30: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
6e40: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
6e50: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
6e60: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
6e70: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
6e80: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
6e90: 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c   findCellv2(D,M,
6ea0: 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62  O,I) (D+(M&get2b
6eb0: 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29  yte(D+(O+2*(I)))
6ec0: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
6ed0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6ee0: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6ef0: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6f00: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6f10: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6f20: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6f30: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6f40: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6f50: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6f60: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6f70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6f80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6f90: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6fa0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
6fb0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
6fc0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6fd0: 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70  int k;.    k = p
6fe0: 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b  Page->aiOvfl[i];
6ff0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
7000: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
7010: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
7020: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d     return pPage-
7030: 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  >apOvfl[i];.    
7040: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
7050: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
7060: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
7070: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
7080: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
7090: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
70a0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
70b0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
70c0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
70d0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
70e0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
70f0: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
7100: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
7110: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
7120: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7130: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
7140: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
7150: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
7160: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
7170: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
7180: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
7190: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
71a0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
71b0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
71c0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
71d0: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
71e0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
71f0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
7200: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
7210: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
7220: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7230: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7240: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7250: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7260: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7270: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
72a0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
72b0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
72c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
72d0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
72e0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
7310: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
7320: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
7330: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
7340: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7350: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
7360: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
7370: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7380: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
7390: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
73a0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
73b0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
73c0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
73d0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
73e0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
73f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7400: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7410: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7420: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7430: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7440: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7450: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
7460: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
7470: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
7480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7490: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
74a0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
74b0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
74c0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
74d0: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
74e0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
74f0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7500: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7510: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7520: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7530: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7540: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7550: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
7560: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
7570: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
7580: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
7590: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
75a0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
75b0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
75c0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
75d0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
75e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
75f0: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7600: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7610: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7620: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7630: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7640: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7650: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
7660: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
7670: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
7680: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
7690: 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d  .    if( (pInfo-
76a0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e  >nSize = (u16)(n
76b0: 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20  +nPayload))<4 ) 
76c0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
76d0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
76e0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
76f0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
7700: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
7710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
7720: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7730: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7740: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7750: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7760: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7770: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7780: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7790: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
77a0: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
77b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
77c0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
77d0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
77e0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
77f0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
7800: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
7810: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
7820: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7830: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7840: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7850: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7860: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7870: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7880: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7890: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
78a0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
78b0: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
78c0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
78d0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
78e0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
78f0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7900: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
7910: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7920: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7930: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7940: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7950: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7960: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7970: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7980: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7990: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
79a0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
79b0: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
79c0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
79d0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
79e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
79f0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
7a00: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
7a10: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
7a20: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7a30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7a40: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7a50: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7a60: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7a70: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7a80: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7a90: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7aa0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7ab0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7ac0: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
7ad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ae0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
7af0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
7b00: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
7b10: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
7b20: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7b30: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7b40: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7b50: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7b60: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7b70: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7b80: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7b90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7ba0: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7bb0: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7bc0: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
7bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
7be0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
7bf0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
7c00: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
7c10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
7c20: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7c40: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7c50: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7c60: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7c70: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7c80: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7c90: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7ca0: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7cb0: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
7cd0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
7ce0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
7cf0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
7d00: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
7d10: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
7d20: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7d30: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7d40: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7d50: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7d60: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7d70: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7d80: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7d90: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7da0: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7db0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7dc0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7dd0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7de0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7df0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7e00: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7e10: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7e20: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7e30: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7e40: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7e50: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7e60: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7e70: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7e80: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7e90: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7ea0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7eb0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7ec0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ed0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7ee0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7ef0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7f00: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7f10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7f20: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7f30: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7f40: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7f50: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7f60: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7f70: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7f80: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7f90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7fa0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7fb0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7fc0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7fd0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7fe0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7ff0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
8000: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
8010: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
8020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
8030: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
8040: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
8050: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
8060: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
8070: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
8080: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
8090: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
80a0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
80b0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
80c0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
80d0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
80e0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
80f0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
8100: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
8110: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
8120: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
8130: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
8140: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
8150: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
8160: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8170: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8180: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8190: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81a0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
81b0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
81c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
81d0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
81e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
81f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
8200: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
8210: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
8220: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8230: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
8240: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8250: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8260: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8270: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8280: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
8290: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
82a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
82b0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
82c0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
82d0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
82e0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
82f0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
8300: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
8310: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
8320: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8330: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8340: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8350: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8360: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8370: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8380: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8390: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
83a0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
83b0: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
83c0: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
83d0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
83e0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
83f0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
8400: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
8410: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8420: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8430: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8440: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8450: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8480: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8490: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
84a0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
84b0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
84c0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
84d0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
84e0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
84f0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
8500: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
8510: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
8520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8530: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8540: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8550: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8560: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8570: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8580: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8590: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
85a0: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
85b0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
85c0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
85d0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
85e0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
85f0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
8600: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
8610: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
8620: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8630: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8640: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8650: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8660: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8670: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8680: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8690: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
86a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
86b0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
86c0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
86d0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
86e0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
86f0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
8700: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
8710: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
8720: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8730: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8740: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8750: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8760: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8770: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8780: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8790: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
87a0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
87b0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
87c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
87d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
87e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
87f0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
8800: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8810: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
8820: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8850: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8860: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8890: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
88a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
88b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
88c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
88d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
88e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
88f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8900: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
8910: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
8920: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8940: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8950: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8960: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8980: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8990: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
89a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
89b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
89c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
89d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
89e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
89f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
8a00: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
8a10: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8a30: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8a40: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8a50: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8a70: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8a80: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8a90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8aa0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8ab0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8ad0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
8ae0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
8af0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
8b00: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8b10: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
8b20: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8b30: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8b40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b50: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8b60: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8b70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8b80: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8b90: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8ba0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8bb0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8bc0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8bd0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
8be0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
8bf0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
8c00: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
8c10: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
8c20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8c30: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8c40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8c50: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8c60: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8c70: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8c80: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8c90: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8ca0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8cb0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8cc0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
8cd0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
8ce0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
8cf0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
8d00: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
8d10: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
8d20: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8d30: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8d40: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8d50: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8d60: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8d70: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8d80: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8d90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8da0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8db0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8dc0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8dd0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8df0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8e00: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8e10: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8e20: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8e30: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8e40: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8e50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e60: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8e70: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8e80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8e90: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8ea0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8ec0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ed0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8ee0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8f00: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8f10: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8f20: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8f30: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8f40: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8f50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8f60: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8f70: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8f80: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8f90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8fa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8fb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8fc0: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8fd0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8fe0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8ff0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9000: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9010: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9020: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9030: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9040: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9050: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9060: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9070: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9080: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9090: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
90a0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
90b0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
90c0: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
90d0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
90e0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
90f0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
9100: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
9110: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9120: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
9130: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
9140: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
9150: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
9160: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
9170: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
9180: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
9190: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
91a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
91b0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
91c0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
91d0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
91e0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
91f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9200: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9210: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
9220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9230: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
9240: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
9250: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
9260: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
9270: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
9280: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9290: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
92a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
92b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
92c0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
92d0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
92e0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
92f0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
9300: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
9310: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
9320: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9330: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9340: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9350: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9360: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9370: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9380: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9390: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
93a0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
93b0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
93c0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
93d0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
93e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
93f0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
9400: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
9410: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
9420: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9430: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9440: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9450: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9460: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9470: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9480: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9490: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
94a0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
94b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
94c0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
94d0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
94e0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
94f0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
9500: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
9510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
9520: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9530: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9540: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9550: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9560: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9570: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9580: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9590: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
95c0: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
95d0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
95e0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9610: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
9620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9630: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9640: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9650: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9660: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9670: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9680: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9690: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
96a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
96b0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
96c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
96d0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
96e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96f0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9700: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9710: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9720: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9730: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9740: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9750: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9760: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9770: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9780: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9790: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
97a0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
97b0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
97c0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
97d0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
97e0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
97f0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
9800: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
9810: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
9820: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9830: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9840: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9850: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9860: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9870: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9880: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9890: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
98a0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
98b0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
98c0: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
98d0: 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  op ) return SQLI
98e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
98f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9900: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
9910: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
9920: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9930: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20   gap==top );..  
9940: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
9950: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64  .    /* Always d
9960: 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79  efragment highly
9970: 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65   fragmented page
9980: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65  s */.    rc = de
9990: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
99a0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
99b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
99c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
99d0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
99e0: 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  +5]);.  }else if
99f0: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  ( gap+2<=top ){.
9a00: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
9a10: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
9a20: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
9a30: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
9a40: 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a   satisfy .    **
9a50: 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68   the request. Th
9a60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
9a70: 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69  made from the fi
9a80: 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  rst free slot in
9a90: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73   .    ** the lis
9aa0: 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20  t that is large 
9ab0: 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61  enough to accoma
9ac0: 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  date it..    */.
9ad0: 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72      int pc, addr
9ae0: 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68  ;.    for(addr=h
9af0: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
9b00: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
9b10: 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a  ))>0; addr=pc){.
9b20: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20        int size; 
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9b40: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73  ze of the free s
9b50: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9b60: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
9b70: 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b   || pc<addr+4 ){
9b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9b90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9ba0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
9bb0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
9bc0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9bd0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
9be0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
9bf0: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
9c00: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
9c10: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
9c20: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
9c30: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
9c40: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
9c60: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
9c70: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
9c80: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
9c90: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  r of.          *
9ca0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
9cb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
9cc0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ge. */.         
9cd0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
9ce0: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
9cf0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
9d00: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29  ta[hdr+7] = (u8)
9d10: 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20  (nFrag + x);.   
9d20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
9d30: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
9d40: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
9d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9d60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9d70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
9d90: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
9da0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
9db0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
9dc0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
9dd0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
9de0: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
9df0: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
9e00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
9e10: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
9e20: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
9e30: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
9e40: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
9e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9e60: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
9e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
9e80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
9e90: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
9ea0: 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74  ace in the gap t
9eb0: 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74  o satisfy.  ** t
9ec0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  he allocation.  
9ed0: 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65  If not, defragme
9ee0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  nt..  */.  testc
9ef0: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
9f00: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
9f10: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
9f20: 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  {.    rc = defra
9f30: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
9f40: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9f50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
9f60: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9f70: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9f80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
9f90: 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  ap+nByte<=top );
9fa0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
9fb0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
9fc0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
9fd0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
9fe0: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
9ff0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
a000: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
a010: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a020: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
a030: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
a040: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
a050: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
a060: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
a070: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
a080: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
a090: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
a0a0: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
a0b0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
a0c0: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
a0d0: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
a0e0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
a0f0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
a100: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
a110: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a120: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
a130: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
a140: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
a150: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
a160: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
a170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
a190: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
a1a0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
a1b0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
a1c0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
a1d0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
a1e0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
a1f0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
a200: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
a210: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
a220: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
a230: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
a240: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
a250: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
a260: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
a270: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
a280: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
a290: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
a2a0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
a2b0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
a2c0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
a2d0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
a2e0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
a2f0: 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20  r;.  int iLast; 
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
a320: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
a330: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
a340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a350: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
a360: 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
a370: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
a380: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a390: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a3a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a3b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
a3c0: 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  start>=pPage->hd
a3d0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
a3e0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
a3f0: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
a400: 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e  t + size) <= (in
a410: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
a420: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
a430: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a440: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a450: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a460: 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30   assert( size>=0
a470: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
a480: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
a490: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  */..  if( pPage-
a4a0: 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
a4b0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
a4c0: 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  TE ){.    /* Ove
a4d0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
a4e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
a4f0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
a500: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20  ecure_delete.   
a510: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
a520: 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  abled */.    mem
a530: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
a540: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a  , 0, size);.  }.
a550: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
a560: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
a570: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
a580: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
a590: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65  te that.  ** eve
a5a0: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
a5b0: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
a5c0: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
a5d0: 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a  InitPage(),.  **
a5e0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a5f0: 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20   did not detect 
a600: 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c  overlapping cell
a610: 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c  s or.  ** freebl
a620: 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61  ocks that overla
a630: 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f  pped cells.   No
a640: 72 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  r does it detect
a650: 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63   when the.  ** c
a660: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a670: 20 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c   exceeds the val
a680: 75 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  ue in the page h
a690: 65 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65  eader.  If these
a6a0: 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73  .  ** situations
a6b0: 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62   arise, then sub
a6c0: 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f  sequent insert o
a6d0: 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  perations might 
a6e0: 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65  corrupt.  ** the
a6f0: 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77   freelist.  So w
a700: 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65  e do need to che
a710: 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f  ck for corruptio
a720: 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67  n while scanning
a730: 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  .  ** the freeli
a740: 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  st..  */.  hdr =
a750: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a760: 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  t;.  addr = hdr 
a770: 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70  + 1;.  iLast = p
a780: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a790: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73  eSize - 4;.  ass
a7a0: 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73  ert( start<=iLas
a7b0: 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  t );.  while( (p
a7c0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
a7d0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73  (&data[addr]))<s
a7e0: 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30  tart && pbegin>0
a7f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67   ){.    if( pbeg
a800: 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20  in<addr+4 ){.   
a810: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a820: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a830: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
a840: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66  pbegin;.  }.  if
a850: 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29  ( pbegin>iLast )
a860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a870: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a880: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a890: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
a8a0: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
a8b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a8c0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
a8d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a8e0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
a8f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
a900: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
a910: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
a920: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20   pPage->nFree + 
a930: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
a940: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
a950: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
a960: 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  /.  addr = hdr +
a970: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
a980: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a990: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
a9a0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
a9b0: 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20  , psize, x;.    
a9c0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
a9d0: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
a9e0: 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e  t( pbegin <= (in
a9f0: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
aa00: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
aa10: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
aa20: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
aa30: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
aa40: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
aa50: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
aa60: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
aa70: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
aa80: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
aa90: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
aaa0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
aab0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ze);.      if( (
aac0: 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67  frag<0) || (frag
aad0: 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37  >(int)data[hdr+7
aae0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
aaf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ab00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
ab10: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72  }.      data[hdr
ab20: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
ab30: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
ab40: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
ab50: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
ab60: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
ab70: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
ab80: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
ab90: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
aba0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
abb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
abc0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
abd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
abe0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
abf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
ac00: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ac10: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
ac20: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
ac30: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
ac40: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
ac50: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
ac60: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
ac70: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
ac80: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
ac90: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
aca0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
acb0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
acc0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
acd0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
ace0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
acf0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
ad00: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
ad10: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
ad20: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ad30: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
ad40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ad50: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
ad60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ad70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ad80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ad90: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
ada0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
adb0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
adc0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
add0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
ade0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
adf0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
ae00: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
ae10: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
ae20: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
ae30: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
ae40: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
ae50: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
ae60: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
ae70: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
ae80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ae90: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
aea0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
aeb0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
aec0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
aed0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
aee0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
aef0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
af00: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
af10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
af20: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
af30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
af40: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
af50: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
af60: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
af70: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
af80: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
af90: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
afa0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
afb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
afc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
afd0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
afe0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
aff0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
b000: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
b010: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
b020: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
b030: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
b040: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
b050: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
b060: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
b070: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
b080: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
b090: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b0a0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
b0b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
b0c0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
b0d0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
b0e0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
b0f0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
b100: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
b110: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b120: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
b130: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
b140: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
b150: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
b160: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
b170: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
b180: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
b190: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b1a0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
b1b0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b1c0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
b1d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
b1e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b1f0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
b200: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
b210: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
b220: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
b230: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b240: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
b250: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
b260: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
b270: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
b280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
b290: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
b2a0: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
b2b0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
b2c0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
b2d0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
b2e0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
b2f0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
b300: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
b310: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
b320: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
b330: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
b340: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b350: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
b360: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
b370: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
b380: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
b390: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
b3a0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
b3b0: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
b3c0: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
b3d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
b3e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b3f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b400: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b410: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
b420: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
b430: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
b440: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
b450: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b460: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
b470: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
b480: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b4a0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
b4b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
b4c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b4d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
b4e0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
b4f0: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
b500: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b510: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
b520: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
b530: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
b540: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
b550: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
b560: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
b570: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
b580: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
b590: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
b5a0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
b5b0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
b5c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
b5d0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b5e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
b5f0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
b600: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
b610: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
b620: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
b630: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
b640: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
b650: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
b660: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
b670: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
b680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b690: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
b6a0: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
b6b0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
b6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b6d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
b6e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
b6f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
b700: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
b710: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
b720: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
b730: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
b740: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
b750: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
b760: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
b770: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
b780: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b790: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
b7a0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
b7b0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
b7c0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
b7d0: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
b7e0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
b7f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
b800: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
b820: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
b830: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
b840: 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67  5536 );.    pPag
b850: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
b860: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
b870: 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67  e - 1);.    pPag
b880: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b890: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b8a0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b8b0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b8c0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b8d0: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b8e0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b8f0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  f;.    pPage->aD
b900: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
b910: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
b920: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
b930: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
b940: 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  et];.    top = g
b950: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
b960: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b970: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
b980: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b990: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
b9a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
b9b0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
b9c0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
b9d0: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
b9e0: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
b9f0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
ba00: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
ba10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba20: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
ba30: 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
ba40: 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
ba50: 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  (pBt) );..    /*
ba60: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
ba70: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
ba80: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
ba90: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
baa0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
bab0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
bac0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
bad0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
bae0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
baf0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
bb00: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
bb10: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
bb20: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
bb30: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
bb40: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
bb50: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
bb60: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
bb70: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
bb80: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
bb90: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
bba0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
bbb0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
bbc0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69  ableSize - 4;.#i
bbd0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
bbe0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
bbf0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
bc00: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20   {.      int i; 
bc10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bc20: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
bc30: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
bc40: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
bc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bc60: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
bc70: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
bc80: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
bc90: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
bca0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
bcb0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
bcc0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bcd0: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
bce0: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
bcf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
bd00: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
bd10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd20: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
bd30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
bd40: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bd50: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
bd60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bd80: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
bd90: 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
bda0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
bdb0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bdc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
bdd0: 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
bde0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
bdf0: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
be00: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
be10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
be20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
be30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
be40: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
be50: 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
be60: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
be70: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
be80: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
be90: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
bea0: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
beb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
bec0: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
bed0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
bee0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
bef0: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
bf00: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
bf10: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf20: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf30: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
bf40: 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 62   Start of free b
bf50: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
bf60: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
bf70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf80: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
bf90: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
bfa0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bfb0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
bfc0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
bfd0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
bfe0: 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20   if( (next>0 && 
bff0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29  next<=pc+size+3)
c000: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
c010: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c020: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
c030: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
c040: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64  nding order. And
c050: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
c060: 66 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 2d 62  f..** the free-b
c070: 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e  lock must lie on
c080: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
c090: 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
c0a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c0b0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
c0c0: 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
c0d0: 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
c0e0: 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
c0f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c100: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
c110: 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
c120: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
c130: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
c140: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  .    ** of the c
c150: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
c160: 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
c170: 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
c180: 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ithin.    ** the
c190: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
c1a0: 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
c1b0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
c1c0: 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20  usable-size.    
c1d0: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
c1e0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
c1f0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
c200: 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
c210: 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74  .    ** serves t
c220: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
c230: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c240: 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
c250: 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  l-content.    **
c260: 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
c270: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
c280: 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
c290: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a   the page..    *
c2a0: 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e  /.    if( nFree>
c2b0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c2c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
c2f0: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c300: 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
c310: 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  st);.    pPage->
c320: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
c330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c340: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
c350: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
c360: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
c370: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
c380: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
c390: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
c3a0: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
c3b0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
c3c0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
c3d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c3e0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
c3f0: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
c400: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
c410: 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
c420: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
c430: 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
c440: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c450: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
c460: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
c470: 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
c480: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c490: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
c4a0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c4b0: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
c4c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c4d0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
c4e0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c4f0: 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
c500: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c510: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
c520: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
c530: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c540: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
c550: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
c560: 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
c570: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
c580: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
c590: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
c5a0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
c5b0: 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64   - hdr);.  }.  d
c5c0: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
c5d0: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
c5e0: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
c5f0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
c600: 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73  =0 ?1:0);.  mems
c610: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
c620: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
c630: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
c640: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c650: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
c660: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
c670: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
c680: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
c690: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
c6a0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
c6b0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
c6c0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
c6d0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c6e0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
c6f0: 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
c700: 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
c710: 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
c720: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
c730: 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
c740: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
c750: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
c760: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
c770: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
c780: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
c790: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
c7a0: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
c7b0: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
c7c0: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
c7d0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c7e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
c7f0: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
c800: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
c810: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
c820: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
c830: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
c840: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
c850: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
c860: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
c870: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
c880: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
c890: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
c8a0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
c8b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c8c0: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
c8d0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
c8e0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
c8f0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
c900: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
c910: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
c920: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
c930: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
c940: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
c950: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
c960: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
c970: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
c980: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
c990: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
c9a0: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
c9b0: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
c9c0: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
c9d0: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
c9e0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
c9f0: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
ca00: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
ca10: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
ca20: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
ca30: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
ca40: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
ca50: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
ca60: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
ca70: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
ca80: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
ca90: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
caa0: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
cab0: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
cac0: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
cad0: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
cae0: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
caf0: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
cb00: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
cb10: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
cb20: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
cb30: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
cb40: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
cb50: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
cb60: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
cb70: 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
cb80: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
cb90: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
cba0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
cbb0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
cbc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
cbd0: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
cbe0: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
cbf0: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
cc00: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
cc10: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
cc20: 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
cc30: 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  t        /* Do n
cc40: 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e  ot load page con
cc50: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
cc60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
cc70: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
cc80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cc90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
cca0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
ccb0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ccc0: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
ccd0: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
cce0: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e  ge**)&pDbPage, n
ccf0: 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28  oContent);.  if(
cd00: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
cd10: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
cd20: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
cd30: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
cd40: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
cd50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cd60: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
cd70: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
cd80: 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
cd90: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
cda0: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
cdb0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
cdc0: 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
cdd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cde0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
cdf0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
ce00: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
ce10: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
ce20: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
ce30: 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
ce40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
ce50: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
ce60: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
ce70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ce80: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
ce90: 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
cea0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
ceb0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
cec0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
ced0: 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
cee0: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
cef0: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
cf00: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
cf10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
cf20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
cf30: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
cf40: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
cf50: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
cf60: 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
cf70: 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
cf80: 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
cf90: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
cfa0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
cfb0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
cfc0: 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
cfd0: 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
cfe0: 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
cff0: 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
d000: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
d010: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
d020: 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
d030: 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
d040: 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
d050: 75 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61  urn (int)btreePa
d060: 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
d070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
d080: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
d090: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
d0a0: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
d0b0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a  tine is just a.*
d0c0: 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  * convenience wr
d0d0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
d0e0: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62  arate calls to b
d0f0: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
d100: 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  d .** btreeInitP
d110: 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
d120: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
d130: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
d140: 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
d150: 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  o is undefined. 
d160: 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
d170: 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
d180: 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
d190: 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
d1a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d1b0: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
d1c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
d1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d1e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
d1f0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
d200: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d210: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
d220: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
d230: 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20  ge **ppPage     
d240: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
d250: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
d260: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
d270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d280: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d290: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 66  >mutex) );..  if
d2a0: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
d2b0: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
d2c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
d2d0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
d2e0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
d2f0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
d300: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  pgno, ppPage, 0)
d310: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d320: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d330: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
d340: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d350: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d360: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d370: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
d380: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
d390: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
d3a0: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
d3b0: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
d3c0: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
d3d0: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
d3e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d3f0: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
d400: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
d410: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
d420: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
d430: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d440: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
d450: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
d460: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
d470: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
d480: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d490: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d4a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d4b0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
d4c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d4d0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
d4e0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
d4f0: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
d500: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d510: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
d520: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
d530: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d540: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d550: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d560: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d570: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
d580: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
d590: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
d5a0: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
d5b0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
d5c0: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
d5d0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
d5e0: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
d5f0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
d600: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d610: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
d620: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
d630: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
d640: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
d650: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
d660: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d670: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d680: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
d690: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
d6a0: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
d6b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d6c0: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
d6d0: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
d6e0: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
d6f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
d700: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
d710: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
d720: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
d730: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
d740: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
d750: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
d760: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
d770: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
d780: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
d790: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
d7a0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d7b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d7c0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d7d0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
d7e0: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
d7f0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
d800: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
d810: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
d820: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
d830: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
d840: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
d850: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
d860: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
d870: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
d880: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
d890: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
d8a0: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
d8b0: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
d8c0: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
d8d0: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
d8e0: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
d8f0: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
d900: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
d910: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
d920: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
d930: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
d940: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
d950: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
d960: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
d970: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
d980: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
d990: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
d9a0: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
d9b0: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
d9c0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
d9d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
d9e0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
d9f0: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
da00: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
da10: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
da20: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
da30: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
da40: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
da50: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
da60: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
da70: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
da80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
da90: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
daa0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
dab0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
dac0: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
dad0: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
dae0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
daf0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
db00: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
db10: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
db20: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
db30: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
db40: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
db50: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
db60: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
db70: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
db80: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
db90: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
dba0: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
dbb0: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
dbc0: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
dbd0: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
dbe0: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
dbf0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
dc00: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
dc10: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
dc20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
dc30: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
dc40: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dc50: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
dc60: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
dc70: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
dc80: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
dc90: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
dca0: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
dcb0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
dcc0: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
dcd0: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
dce0: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
dcf0: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
dd00: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
dd10: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
dd20: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
dd30: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
dd40: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
dd50: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
dd60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
dd70: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
dd80: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
dd90: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
dda0: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
ddb0: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
ddc0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
ddd0: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
dde0: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
ddf0: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
de00: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
de10: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
de20: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
de30: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
de40: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
de50: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
de60: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
de70: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
de80: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
de90: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
dea0: 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
deb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dec0: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
ded0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
dee0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
def0: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
df00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
df10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
df20: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
df30: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
df40: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
df50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
df60: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
df70: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
df80: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dfa0: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
dfb0: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
dfc0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
dfd0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
dfe0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
dff0: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
e000: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
e010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e020: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
e030: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e040: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
e070: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
e080: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
e090: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
e0a0: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
e0b0: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
e0c0: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
e0d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
e0f0: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
e100: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
e110: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e130: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
e140: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
e150: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
e160: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
e170: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
e180: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
e190: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
e1a0: 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
e1b0: 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
e1c0: 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
e1d0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
e1e0: 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
e1f0: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
e200: 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
e210: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
e220: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
e230: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
e240: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
e250: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
e260: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
e270: 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
e280: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e290: 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
e2a0: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
e2b0: 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
e2c0: 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
e2d0: 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
e2e0: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
e2f0: 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
e320: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
e330: 6d 6f 72 79 28 64 62 29 29 3b 0a 23 65 6e 64 69  mory(db));.#endi
e340: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
e350: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e360: 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
e370: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e380: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
e390: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
e3a0: 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
e3b0: 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
e3c0: 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
e3d0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
e3e0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
e3f0: 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
e400: 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
e410: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e420: 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
e430: 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
e440: 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
e450: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
e460: 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
e470: 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
e480: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
e490: 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
e4a0: 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
e4b0: 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
e4c0: 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
e4d0: 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
e4e0: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
e4f0: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
e500: 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
e510: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e520: 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
e530: 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
e540: 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
e550: 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
e560: 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
e570: 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
e580: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
e590: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
e5a0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
e5b0: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
e5c0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
e5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e5e0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
e5f0: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
e600: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
e610: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e620: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
e630: 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
e640: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
e650: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
e660: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
e670: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
e680: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
e690: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e6a0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
e6b0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
e6c0: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
e6d0: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
e6e0: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
e6f0: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
e700: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
e710: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
e720: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
e730: 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
e740: 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
e750: 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
e760: 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
e770: 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
e780: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
e790: 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
e7a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c  .      int nFull
e7b0: 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
e7c0: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
e7d0: 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c       char *zFull
e7e0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e7f0: 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61  e3Malloc(nFullPa
e800: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d  thname);.      M
e810: 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
e820: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e830: 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
e840: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e850: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
e860: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e870: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e880: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
e890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e8a0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
e8b0: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
e8c0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
e8d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
e8e0: 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
e8f0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
e900: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  me)+1);.      }e
e910: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
e920: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
e930: 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
e940: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
e970: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
e980: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e990: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e9a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e9b0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e9c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
e9d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
e9e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e9f0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
ea00: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
ea10: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
ea20: 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
ea30: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
ea40: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
ea50: 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
ea60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ea70: 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
ea80: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
ea90: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
eaa0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
eab0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
eac0: 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
ead0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
eae0: 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
eaf0: 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
eb00: 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
eb10: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
eb20: 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
eb30: 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
eb40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
eb50: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
eb60: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
eb70: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
eb80: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
eb90: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
eba0: 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
ebc0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
ebd0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
ebe0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
ebf0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
ec00: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
ec10: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
ec20: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
ec30: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
ec40: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
ec50: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
ec60: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
ec70: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
ec80: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
ec90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eca0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
ecb0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
ecc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ecd0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
ece0: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
ecf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ed00: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
ed10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ed20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ed30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
ed40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ed50: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
ed60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ed70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
ed80: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
ed90: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
eda0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
edb0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
edc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
edd0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ede0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
edf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ee00: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ee10: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
ee20: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
ee30: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
ee40: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
ee50: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
ee60: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
ee70: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
ee80: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
ee90: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
eea0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
eeb0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
eec0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
eed0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
eee0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
eef0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
ef00: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
ef10: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
ef20: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
ef30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
ef40: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
ef50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
ef60: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
ef70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
ef80: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
ef90: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
efa0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
efb0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
efc0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
efd0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
efe0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
eff0: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
f000: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
f010: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
f020: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
f030: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
f040: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
f050: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f060: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
f070: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
f080: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f090: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
f0a0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
f0b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f0c0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
f0d0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f0e0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
f0f0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
f100: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
f110: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
f120: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
f130: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
f140: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
f150: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f160: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
f170: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f180: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
f190: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
f1a0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
f1b0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
f1e0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
f1f0: 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
f200: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
f210: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f220: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f230: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
f240: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
f250: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
f260: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
f270: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
f280: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f290: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
f2a0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
f2b0: 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
f2c0: 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
f2d0: 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
f2e0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
f2f0: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
f300: 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
f310: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
f320: 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
f330: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
f340: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
f350: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
f360: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
f370: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
f380: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
f390: 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
f3a0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
f3b0: 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
f3c0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
f3d0: 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
f3e0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
f3f0: 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
f400: 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  f.    pBt->pageS
f410: 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
f420: 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
f430: 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
f440: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
f450: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
f460: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
f470: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
f480: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
f490: 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
f4a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
f4b0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
f4c0: 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
f4d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f4e0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
f4f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
f500: 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
f510: 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
f520: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f530: 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
f540: 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
f550: 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
f560: 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
f570: 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
f580: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
f590: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
f5a0: 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
f5b0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
f5c0: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
f5d0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
f5e0: 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
f5f0: 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
f600: 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
f610: 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
f620: 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
f630: 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
f640: 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
f650: 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
f660: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
f670: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
f680: 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
f690: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
f6a0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
f6b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
f6c0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
f6d0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
f6e0: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
f6f0: 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
f700: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
f710: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
f720: 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
f730: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65  }else{.      nRe
f740: 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
f750: 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
f760: 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
f770: 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
f780: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f790: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
f7a0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
f7b0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
f7c0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
f7d0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
f7e0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
f7f0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
f800: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
f810: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
f820: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
f830: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
f840: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
f850: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
f860: 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
f870: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
f880: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f890: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
f8a0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
f8b0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
f8c0: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
f8d0: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
f8e0: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
f8f0: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
f900: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
f910: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
f920: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
f930: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
f940: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f950: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
f960: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
f970: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
f980: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
f990: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
f9a0: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
f9b0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
f9c0: 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
f9d0: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
f9e0: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
f9f0: 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52   ).      pBt->nR
fa00: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55  ef = 1;.      MU
fa10: 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78  TEX_LOGIC( mutex
fa20: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
fa30: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fa40: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
fa50: 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69  ASTER);).      i
fa60: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
fa70: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
fa80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
fa90: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
faa0: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
fab0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
fac0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
fad0: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
fae0: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
faf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
fb00: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fb10: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
fb20: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
fb30: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
fb40: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
fb50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fb60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
fb70: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
fb80: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
fb90: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
fba0: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
fbb0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
fbc0: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
fbd0: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
fbe0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
fbf0: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
fc00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fc10: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
fc20: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
fc30: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
fc40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
fc50: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
fc60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
fc70: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
fc80: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
fc90: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
fca0: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
fcb0: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
fcc0: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
fcd0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
fce0: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
fcf0: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
fd00: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
fd10: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
fd20: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
fd30: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
fd40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
fd50: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
fd60: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
fd70: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
fd80: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
fd90: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
fda0: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
fdb0: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
fdc0: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
fdd0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
fde0: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
fdf0: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
fe00: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
fe10: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
fe20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
fe30: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
fe40: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
fe50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
fe60: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
fe70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
fe80: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
fe90: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
fea0: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
feb0: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
fec0: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
fed0: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
fee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
fef0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
ff00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
ff10: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
ff20: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
ff30: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
ff40: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
ff50: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
ff60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ff70: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
ff80: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
ff90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ffa0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ffb0: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
ffc0: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
ffd0: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
ffe0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fff0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
10000 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
10010 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
10020 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
10030 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
10040 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
10050 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10060 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
10070 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
10080 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
10090 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73  -Tree was succes
100a0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73  sfully opened, s
100b0 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  et the pager-cac
100c0 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20  he size to the. 
100d0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61     ** default va
100e0 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65  lue. Except, whe
100f0 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20  n opening on an 
10100 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20  existing shared 
10110 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20  pager-cache,.   
10120 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67   ** do not chang
10130 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  e the pager-cach
10140 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
10150 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
10160 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20  reeSchema(p, 0, 
10170 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  0)==0 ){.      s
10180 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
10190 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e  chesize(p->pBt->
101a0 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44  pPager, SQLITE_D
101b0 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
101c0 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  E);.    }.  }.  
101d0 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
101e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
101f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10200 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
10210 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10220 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
10230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10240 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
10250 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
10260 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
10270 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
10280 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
10290 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
102a0 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
102b0 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
102c0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
102d0 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
102e0 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
102f0 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
10300 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
10310 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
10320 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
10330 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
10340 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
10350 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
10360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10370 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55  HARED_CACHE.  MU
10380 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
10390 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
103a0 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20  r; ).  BtShared 
103b0 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
103c0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
103d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
103e0 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
103f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54  >mutex) );.  MUT
10400 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
10410 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
10420 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
10430 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
10440 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
10450 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
10460 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
10470 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
10480 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
10490 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
104a0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
104b0 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
104c0 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
104d0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
104e0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
104f0 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
10500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10510 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
10520 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
10530 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
10540 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
10550 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
10560 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
10570 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
10580 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
10590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
105a0 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
105b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
105c0 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
105d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
105e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
105f0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
10600 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10610 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
10620 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
10630 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
10640 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
10650 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
10660 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
10670 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
10680 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
10690 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
106a0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
106b0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
106c0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
106d0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
106e0 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
106f0 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
10700 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
10710 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
10720 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
10730 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
10740 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
10750 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
10760 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  pageSize );.  }.
10770 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
10780 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
10790 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
107a0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
107b0 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
107c0 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
107d0 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d  e3PageFree( pBt-
107e0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70  >pTmpSpace);.  p
107f0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
10800 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
10810 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
10820 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
10830 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
10840 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10850 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
10860 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10870 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
10880 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
10890 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
108a0 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
108b0 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
108c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
108d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
108e0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
108f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10900 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
10910 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
10920 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
10930 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
10940 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
10950 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
10960 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
10970 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
10980 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10990 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
109a0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
109b0 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
109c0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
109d0 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
109e0 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
109f0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
10a00 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
10a10 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
10a20 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
10a30 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
10a40 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
10a50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
10a60 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45  llback(p, SQLITE
10a70 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  _OK);.  sqlite3B
10a80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
10a90 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
10aa0 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
10ab0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
10ac0 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
10ad0 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
10ae0 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
10af0 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
10b00 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
10b10 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
10b20 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
10b30 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
10b40 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10b50 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
10b60 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
10b70 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
10b80 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
10b90 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
10ba0 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
10bb0 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
10bc0 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
10bd0 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
10be0 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
10bf0 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
10c00 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
10c10 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
10c20 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
10c30 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
10c40 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
10c50 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
10c60 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
10c70 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
10c80 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
10c90 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
10ca0 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
10cb0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
10cc0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
10cd0 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10ce0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
10cf0 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63  Free(0, pBt->pSc
10d00 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54  hema);.    freeT
10d10 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
10d20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10d30 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  pBt);.  }..#ifnd
10d40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10d50 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73  HARED_CACHE.  as
10d60 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
10d70 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ock==0 );.  asse
10d80 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  rt( p->locked==0
10d90 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   );.  if( p->pPr
10da0 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70  ev ) p->pPrev->p
10db0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
10dc0 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
10dd0 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ) p->pNext->pPre
10de0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65  v = p->pPrev;.#e
10df0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
10e00 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72  free(p);.  retur
10e10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10e20 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10e30 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
10e40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c  mber of pages al
10e50 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63  lowed in the cac
10e60 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  he..**.** The ma
10e70 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
10e80 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73  cache pages is s
10e90 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  et to the absolu
10ea0 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d  te.** value of m
10eb0 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67  xPage.  If mxPag
10ec0 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
10ed0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a  he pager will.**
10ee0 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72   operate asynchr
10ef0 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c  onously - it wil
10f00 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f  l not stop to do
10f10 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20   fsync()s.** to 
10f20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77  insure data is w
10f30 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69  ritten to the di
10f40 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72  sk surface befor
10f50 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e  e.** continuing.
10f60 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73    Transactions s
10f70 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e  till work if syn
10f80 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
10f90 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
10fa0 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63  base cannot be c
10fb0 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73  orrupted if this
10fc0 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73   program.** cras
10fd0 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65  hes.  But if the
10fe0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
10ff0 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
11000 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75  re is.** an abru
11010 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  pt power failure
11020 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75   when synchronou
11030 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61  s is off, the da
11040 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20  tabase.** could 
11050 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  be left in an in
11060 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75  consistent and u
11070 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61  nrecoverable sta
11080 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f  te..** Synchrono
11090 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  us is on by defa
110a0 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20  ult so database 
110b0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f  corruption is no
110c0 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20  t.** normally a 
110d0 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  worry..*/.int sq
110e0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
110f0 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
11100 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
11110 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11120 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11130 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11140 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
11150 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
11160 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11170 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
11180 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
11190 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
111a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
111b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
111c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
111d0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
111e0 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
111f0 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
11200 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
11210 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
11220 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
11230 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
11240 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
11250 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
11260 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
11270 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
11280 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
11290 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
112a0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
112b0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
112c0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
112d0 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
112e0 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
112f0 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
11300 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
11310 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
11320 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
11330 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
11340 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11350 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
11360 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
11370 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
11380 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
11390 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
113a0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
113b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
113c0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20  tSafetyLevel(.  
113d0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
113e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
113f0 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
11400 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
11410 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20  /.  int level,  
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52             /* PR
11430 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
11440 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d  .  1=OFF, 2=NORM
11450 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20  AL, 3=FULL */.  
11460 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20  int fullSync,   
11470 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11480 20 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20   fullfsync. */. 
11490 20 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e   int ckptFullSyn
114a0 63 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d  c       /* PRAGM
114b0 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c  A checkpoint_ful
114c0 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74  lfync */.){.  Bt
114d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
114e0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
114f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11500 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
11510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65   );.  assert( le
11520 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c  vel>=1 && level<
11530 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =3 );.  sqlite3B
11540 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11550 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
11560 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
11570 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
11580 75 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c  ullSync, ckptFul
11590 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  lSync);.  sqlite
115a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
115b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
115c0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
115d0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
115e0 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72  if the given btr
115f0 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66  ee is set to saf
11600 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e  ety level 1.  In
11610 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
11620 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
11630 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73  no sync() occurs
11640 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
11650 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
11660 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
11670 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  led(Btree *p){. 
11680 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11690 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
116a0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
116b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
116c0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
116d0 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65    .  sqlite3Btre
116e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
116f0 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
11700 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20  >pPager );.  rc 
11710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  = sqlite3PagerNo
11720 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72  sync(pBt->pPager
11730 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11740 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11760 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
11770 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
11780 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
11790 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
117a0 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
117b0 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
117c0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
117d0 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
117e0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
117f0 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
11800 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
11810 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
11820 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
11830 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
11840 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
11850 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
11860 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
11870 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
11880 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
11890 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
118a0 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
118b0 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
118c0 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
118d0 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
118e0 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
118f0 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
11900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11910 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
11920 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
11930 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
11940 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
11950 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
11960 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
11970 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
11980 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
11990 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
119a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
119b0 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
119c0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
119d0 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
119e0 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
119f0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
11a00 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
11a10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
11a20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
11a30 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
11a40 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
11a50 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
11a60 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
11a70 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
11a80 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
11a90 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
11aa0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
11ab0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
11ac0 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
11ad0 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
11ae0 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
11af0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
11b00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11b10 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11b20 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
11b30 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
11b40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11b50 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
11b60 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
11b70 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
11b80 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
11b90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11ba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11bb0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
11bc0 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
11bd0 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
11be0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11bf0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
11c00 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
11c10 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
11c20 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
11c30 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
11c40 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
11c50 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
11c60 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
11c70 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
11c80 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
11c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
11ca0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
11cb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
11cc0 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70  Bt->pPage1 && !p
11cd0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
11ce0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
11cf0 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
11d00 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
11d10 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
11d20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11d30 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
11d40 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
11d50 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
11d60 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
11d70 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
11d80 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
11d90 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
11da0 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
11db0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
11dc0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
11dd0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11de0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11df0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11e00 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
11e10 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
11e20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11e30 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
11e40 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
11e50 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
11e60 7a 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  ze;.}..#if !defi
11e70 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11e80 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
11e90 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11ea0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
11eb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11ec0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
11ed0 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
11ee0 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
11ef0 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
11f00 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
11f10 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
11f20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
11f30 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
11f40 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
11f50 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  y extensions..*/
11f60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11f70 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65  eGetReserve(Btre
11f80 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
11f90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11fa0 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d  ter(p);.  n = p-
11fb0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
11fc0 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
11fd0 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ize;.  sqlite3Bt
11fe0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11ff0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
12000 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
12010 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
12020 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
12030 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
12040 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
12050 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
12060 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
12070 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
12080 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
12090 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
120a0 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
120b0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
120c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
120d0 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
120e0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
120f0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
12100 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12110 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
12120 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
12130 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
12140 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
12150 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12160 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
12170 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
12180 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
12190 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
121a0 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
121b0 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
121c0 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
121d0 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
121e0 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
121f0 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
12200 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
12210 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
12220 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
12230 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
12240 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
12250 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
12260 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
12270 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
12280 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12290 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
122a0 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
122b0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
122c0 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
122d0 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
122e0 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
122f0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
12300 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
12310 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
12320 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
12330 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
12340 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
12350 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12360 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e   return b;.}.#en
12370 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
12380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
12390 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
123a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
123b0 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
123c0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
123d0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
123e0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
123f0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
12400 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
12410 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
12420 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
12430 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
12440 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
12450 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
12460 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
12470 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
12480 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
12490 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
124a0 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
124b0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
124c0 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
124d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
124e0 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
124f0 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
12500 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
12510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12520 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
12530 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
12540 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
12550 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12560 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12570 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
12580 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
12590 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
125a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
125b0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
125c0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
125d0 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
125e0 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
125f0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
12600 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
12610 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
12620 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
12630 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
12640 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
12650 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
12660 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12670 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12680 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
12690 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
126a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
126b0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
126c0 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
126d0 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
126e0 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
126f0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
12700 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12710 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
12720 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
12730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12740 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
12750 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
12760 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
12770 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
12780 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12790 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
127a0 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
127b0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
127c0 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
127d0 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
127e0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
127f0 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
12800 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
12810 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
12820 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12830 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12840 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
12850 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
12860 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
12870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12880 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
12890 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
128a0 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
128b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
128c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
128d0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
128e0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
128f0 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
12900 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
12910 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
12920 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
12930 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
12940 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
12950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
12960 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
12970 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
12980 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
12990 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
129a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
129b0 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
129c0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
129d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
129e0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
129f0 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
12a00 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
12a10 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67  age1;     /* Pag
12a20 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
12a30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
12a40 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
12a50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12a60 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
12a70 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
12a80 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20  PageFile = 0;   
12a90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
12aa0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
12ab0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
12ac0 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20   nPageHeader;   
12ad0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
12ae0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
12af0 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74  base according t
12b00 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65  o hdr */..  asse
12b10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12b20 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
12b30 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12b40 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
12b50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12b60 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
12b70 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12b90 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
12ba0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
12bb0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
12bc0 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
12bd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
12be0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
12bf0 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
12c00 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
12c10 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
12c20 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
12c30 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
12c40 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
12c50 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61  nPage = nPageHea
12c60 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32  der = get4byte(2
12c70 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
12c80 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
12c90 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
12ca0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
12cb0 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
12cc0 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
12cd0 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31  p(24+(u8*)pPage1
12ce0 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a  ->aData, 92+(u8*
12cf0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34  )pPage1->aData,4
12d00 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
12d10 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20  e = nPageFile;. 
12d20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30   }.  if( nPage>0
12d30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65   ){.    u32 page
12d40 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73  Size;.    u32 us
12d50 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
12d60 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
12d70 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
12d80 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
12d90 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
12da0 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
12db0 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
12dc0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
12dd0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
12de0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
12df0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
12e00 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
12e10 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
12e20 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
12e30 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
12e40 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
12e50 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
12e60 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12e70 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
12e80 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
12e90 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
12ea0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
12eb0 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
12ec0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
12ed0 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
12ee0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12ef0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
12f00 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
12f10 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
12f20 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
12f30 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
12f40 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
12f50 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
12f60 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
12f70 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
12f80 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
12f90 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
12fa0 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
12fb0 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
12fc0 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
12fd0 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
12fe0 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
12ff0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
13000 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
13010 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
13020 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
13030 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
13040 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
13050 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
13060 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
13070 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
13080 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
13090 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
130a0 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
130b0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
130c0 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
130d0 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
130e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
130f0 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
13100 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
13110 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
13120 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
13130 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
13140 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
13150 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13160 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
13170 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13180 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
13190 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
131a0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
131b0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
131c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
131d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
131e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
131f0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
13200 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54  #endif..    /* T
13210 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64  he maximum embed
13220 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
13230 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25  t be exactly 25%
13240 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d  .  And the minim
13250 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64  um.    ** embedd
13260 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
13270 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f   be 12.5% for bo
13280 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64  th leaf-data and
13290 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a   non-leaf-data..
132a0 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
132b0 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
132c0 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
132d0 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
132e0 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
132f0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
13300 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
13310 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
13320 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
13330 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
13340 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
13350 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
13360 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
13370 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a     }.    pageSiz
13380 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c  e = (page1[16]<<
13390 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c  8) | (page1[17]<
133a0 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28  <16);.    if( ((
133b0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
133c0 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c  Size)!=0.     ||
133d0 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
133e0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
133f0 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
13400 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20  <=256 .    ){.  
13410 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
13420 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
13430 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
13440 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
13450 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
13460 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
13470 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
13480 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
13490 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
134a0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
134b0 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
134c0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
134d0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
134e0 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
134f0 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
13500 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
13510 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
13520 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
13530 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
13540 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
13550 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
13560 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
13570 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
13580 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
13590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
135a0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
135b0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
135c0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
135d0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
135e0 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
135f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
13600 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
13610 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
13620 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
13630 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
13640 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
13650 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
13660 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
13670 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13680 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
13690 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
136a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
136e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
136f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13700 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d     if( (pBt->db-
13710 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
13720 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30  RecoveryMode)==0
13730 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
13740 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
13750 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
13760 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
13770 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13780 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
13790 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38  f( usableSize<48
137a0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
137b0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
137c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
137d0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
137e0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
137f0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
13800 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
13810 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13820 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
13830 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
13840 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
13850 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
13860 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
13870 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
13880 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
13890 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
138a0 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
138b0 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
138c0 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
138d0 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
138e0 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
138f0 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
13900 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
13910 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
13920 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
13930 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
13940 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
13950 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
13960 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
13970 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
13980 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
13990 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
139a0 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
139b0 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
139c0 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
139d0 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
139e0 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
139f0 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
13a00 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
13a10 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
13a20 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
13a30 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
13a40 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
13a50 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
13a60 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20  2-byte pointer, 
13a70 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
13a80 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
13a90 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
13aa0 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
13ab0 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
13ac0 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
13ad0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
13ae0 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
13af0 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
13b00 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
13b10 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
13b20 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  4/255 - 23);.  p
13b30 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
13b40 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
13b50 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
13b60 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
13b70 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70  axLeaf = (u16)(p
13b80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
13b90 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   35);.  pBt->min
13ba0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42  Leaf = (u16)((pB
13bb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
13bc0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
13bd0 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f    if( pBt->maxLo
13be0 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70  cal>127 ){.    p
13bf0 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
13c00 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c  oad = 127;.  }el
13c10 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78  se{.    pBt->max
13c20 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28  1bytePayload = (
13c30 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  u8)pBt->maxLocal
13c40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13c50 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
13c60 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
13c70 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
13c80 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
13c90 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  ;.  pBt->nPage =
13ca0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
13cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
13cc0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
13cd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
13ce0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
13cf0 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
13d00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13d10 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
13d20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
13d30 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
13d40 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
13d50 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
13d60 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
13d70 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
13d80 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
13d90 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
13da0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
13db0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
13dc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
13dd0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
13de0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
13df0 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
13e00 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13e10 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
13e20 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
13e30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13e40 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13e50 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
13e60 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
13e70 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
13e80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13e90 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
13ea0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13eb0 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  t( pBt->pCursor=
13ec0 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
13ed0 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
13ee0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
13ef0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13f00 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
13f10 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
13f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
13f30 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
13f40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13f50 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
13f60 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
13f70 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
13f80 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
13f90 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c  aData );.    rel
13fa0 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
13fb0 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age1);.    pBt->
13fc0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a  pPage1 = 0;.  }.
13fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
13fe0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
13ff0 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
14000 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
14010 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
14020 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
14030 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
14040 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
14050 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
14060 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
14070 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
14080 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14090 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
140a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
140b0 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
140c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
140d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
140e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
140f0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
14100 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
14110 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
14120 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
14130 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
14140 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
14150 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
14160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
14170 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
14180 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
14190 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
141a0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
141b0 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
141c0 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
141d0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
141e0 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
141f0 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
14200 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
14210 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
14220 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
14230 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
14240 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
14250 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
14260 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
14270 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
14280 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
14290 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
142a0 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
142b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
142c0 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
142d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
142e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
142f0 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
14300 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
14310 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
14320 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
14330 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
14340 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
14350 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
14360 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
14370 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
14380 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
14390 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
143a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
143b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
143c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
143d0 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
143e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
143f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
14400 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
14410 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
14420 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
14430 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
14440 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
14450 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
14460 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
14470 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
14480 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
14490 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
144a0 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
144b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
144c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
144d0 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
144e0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
144f0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
14500 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
14510 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
14520 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
14530 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
14540 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
14550 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
14560 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
14570 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
14580 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
14590 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
145a0 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
145b0 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
145c0 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
145d0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
145e0 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
145f0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
14600 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
14610 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
14620 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
14630 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
14640 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
14650 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
14660 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
14670 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
14680 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
14690 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
146a0 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
146b0 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
146c0 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
146d0 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
146e0 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
146f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
14700 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
14710 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
14720 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
14730 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
14740 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
14750 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
14760 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14770 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
14780 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14790 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
147a0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
147b0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
147c0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
147d0 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
147e0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
147f0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
14800 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14810 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
14820 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
14830 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
14840 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
14850 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
14860 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
14870 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
14880 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
14890 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
148a0 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
148b0 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
148c0 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
148d0 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
148e0 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
148f0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
14900 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
14910 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
14920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
14930 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
14940 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
14950 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
14960 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
14970 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
14980 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
14990 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
149a0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
149b0 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
149c0 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
149d0 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
149e0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
149f0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
14a00 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
14a10 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
14a20 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
14a30 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
14a40 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
14a50 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
14a60 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
14a70 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
14a80 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
14a90 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
14aa0 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
14ab0 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
14ac0 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
14ad0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
14ae0 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
14af0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
14b00 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
14b10 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
14b20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
14b30 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
14b40 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
14b50 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
14b60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
14b70 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
14b80 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
14b90 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
14ba0 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
14bb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
14bc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14bd0 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
14be0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14bf0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14c00 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
14c10 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
14c20 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
14c30 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
14c40 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
14c50 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
14c60 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
14c70 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
14c80 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
14c90 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
14ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14cb0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
14cc0 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
14cd0 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
14ce0 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
14cf0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
14d00 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
14d10 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
14d20 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
14d30 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
14d40 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
14d50 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
14d60 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
14d70 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67  LY)!=0 && wrflag
14d80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14d90 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
14da0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
14db0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
14dc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14dd0 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
14de0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
14df0 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
14e00 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
14e10 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
14e20 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
14e30 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
14e40 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
14e50 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
14e60 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
14e70 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
14e80 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
14e90 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
14ea0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
14eb0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
14ec0 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d  ITE).   || (pBt-
14ed0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
14ee0 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b  PENDING)!=0.  ){
14ef0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
14f00 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
14f10 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
14f20 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
14f30 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
14f40 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
14f50 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
14f60 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
14f70 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14f80 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
14f90 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
14fa0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
14fb0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
14fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14fd0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
14fe0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14ff0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
15000 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
15010 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15020 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
15030 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
15040 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
15050 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
15060 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
15070 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
15080 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
15090 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
150a0 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
150b0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
150c0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
150d0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
150e0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
150f0 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
15100 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
15110 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
15120 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
15130 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
15140 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
15150 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
15160 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
15170 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
15180 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
15190 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
151a0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
151b0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
151c0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
151d0 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
151e0 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
151f0 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
15200 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
15210 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
15220 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
15230 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
15240 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
15250 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
15260 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
15270 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
15280 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
15290 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
152a0 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
152b0 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
152c0 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
152d0 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
152e0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
152f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15300 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
15310 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
15320 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
15330 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
15340 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
15350 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
15360 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
15370 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
15380 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
15390 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
153a0 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
153b0 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
153c0 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
153d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
153e0 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
153f0 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
15400 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
15410 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
15420 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15430 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
15440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15460 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
15470 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
15480 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
15490 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
154a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
154b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
154c0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
154d0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
154e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
154f0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
15500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15510 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
15520 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
15530 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
15540 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
15550 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
15560 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15570 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
15580 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
15590 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
155a0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
155b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
155c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
155d0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
155e0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
155f0 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
15600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15610 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
15620 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
15630 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
15640 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
15650 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
15660 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
15670 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
15680 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
15690 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
156a0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
156b0 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
156c0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
156d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
156e0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
156f0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
15700 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
15710 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
15720 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
15730 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
15740 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15750 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
15760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15770 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
15780 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
15790 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
157a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
157b0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
157c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
157d0 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
157e0 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
157f0 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
15800 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
15810 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
15820 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
15830 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
15840 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
15850 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
15860 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
15870 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
15880 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
15890 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
158a0 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
158b0 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
158c0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
158d0 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
158e0 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
158f0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
15900 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
15910 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
15920 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
15930 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
15940 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
15950 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
15960 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
15970 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
15980 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
15990 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
159a0 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
159b0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
159c0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
159d0 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
159e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
159f0 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
15a00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15a10 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
15a20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
15a30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15a40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
15a50 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
15a60 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
15a70 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
15a80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15a90 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
15aa0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
15ab0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
15ac0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
15ad0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
15ae0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
15af0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
15b00 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
15b10 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
15b20 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
15b30 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
15b40 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
15b50 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
15b60 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
15b70 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
15b80 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
15b90 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
15ba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15bb0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
15bc0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15bd0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
15be0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
15bf0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15c00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15c10 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15c20 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
15c30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15c40 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
15c50 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
15c60 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15c70 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
15c80 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
15c90 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
15ca0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
15cb0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
15cc0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
15cd0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
15ce0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
15cf0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
15d00 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
15d10 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
15d20 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
15d30 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
15d60 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
15d70 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15da0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
15db0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
15dc0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15de0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
15df0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15e00 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
15e10 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
15e20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
15e30 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
15e40 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
15e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15e60 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
15e70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15e80 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
15e90 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
15ea0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15eb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
15ec0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
15ed0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
15ee0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
15ef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
15f00 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
15f10 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
15f20 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
15f30 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
15f40 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
15f50 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
15f60 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15f70 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
15f80 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
15f90 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
15fa0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
15fb0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
15fc0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
15fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15fe0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
15ff0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
16000 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
16010 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16020 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16030 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
16040 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
16050 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
16060 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
16070 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
16080 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
16090 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
160a0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
160b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
160c0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
160d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
160e0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
160f0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
16100 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
16110 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
16120 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
16130 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
16140 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
16150 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
16160 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
16170 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
16180 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
16190 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
161a0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
161b0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
161e0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
161f0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
16200 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
16210 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
16220 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
16230 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16240 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
16250 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
16260 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
16270 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
16280 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
16290 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
162a0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
162b0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
162c0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
162d0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
162e0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
162f0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
16300 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
16310 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
16320 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
16330 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
16340 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
16350 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16360 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
16370 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
16380 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
16390 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
163a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
163b0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
163c0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
163d0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
163e0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
163f0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16400 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
16410 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
16420 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
16430 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
16440 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
16450 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16460 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
16470 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
16480 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
16490 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
164a0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
164b0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
164c0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
164d0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
164e0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
164f0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
16500 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
16510 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
16520 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
16530 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
16540 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
16550 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16560 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
16570 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
16580 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
16590 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
165a0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
165b0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
165c0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
165d0 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
165e0 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
165f0 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
16600 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
16610 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
16620 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
16630 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
16640 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
16650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
16660 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
16670 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
16680 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
16690 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
166a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
166b0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
166c0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
166d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
166e0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
166f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16700 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
16710 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
16720 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
16730 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
16740 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
16750 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
16760 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
16770 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
16780 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
16790 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
167a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
167b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
167c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
167d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
167e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
167f0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
16800 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
16810 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
16820 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
16840 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
16850 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
16860 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
16870 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
16880 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
16890 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
168a0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
168b0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
168c0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
168d0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
168e0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
168f0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
16900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
16910 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
16920 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
16930 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
16940 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
16950 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
16960 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
16970 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
16980 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
16990 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
169a0 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
169b0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
169c0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
169d0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
169e0 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
169f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
16a00 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
16a10 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
16a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
16a30 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
16a40 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
16a50 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
16a60 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
16a70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
16a80 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
16a90 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
16aa0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
16ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16ac0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
16ad0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
16ae0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
16af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
16b00 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
16b10 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
16b20 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
16b30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
16b40 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
16b50 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
16b60 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
16b70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
16b80 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
16b90 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
16ba0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
16bb0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
16bc0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
16bd0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16be0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
16bf0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
16c00 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
16c10 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
16c20 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
16c30 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
16c40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16c50 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
16c60 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
16c70 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
16c80 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
16c90 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
16ca0 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
16cb0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
16cc0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
16cd0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
16ce0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
16cf0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
16d00 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
16d10 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
16d20 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
16d30 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
16d40 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
16d50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16d60 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
16d70 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
16d80 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
16d90 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
16da0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16db0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16dc0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
16dd0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
16de0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
16df0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
16e00 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
16e10 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
16e20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
16e30 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
16e40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
16e50 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
16e60 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
16e70 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
16e80 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
16e90 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
16ea0 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
16eb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
16ec0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
16ed0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
16ee0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
16ef0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
16f00 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
16f10 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
16f20 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
16f30 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
16f40 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
16f50 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
16f60 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
16f70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
16f80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
16f90 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
16fa0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
16fb0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
16fc0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
16fd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17000 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
17010 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
17020 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
17030 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
17040 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
17050 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
17060 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
17070 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
17080 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
17090 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
170a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
170b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
170c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
170d0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
170e0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
170f0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
17100 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
17110 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
17120 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
17130 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
17140 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
17150 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
17160 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
17170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
17180 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
17190 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
171a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
171b0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
171c0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
171d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
171e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
171f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
17200 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
17210 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
17220 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
17230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17240 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
17250 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
17260 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17270 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
17280 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
17290 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
172a0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
172b0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
172c0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
172d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
172e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
172f0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17300 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
17310 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
17320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
17340 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
17350 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
17360 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
17370 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
17380 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
17390 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
173a0 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
173b0 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
173c0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
173d0 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
173e0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
173f0 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
17400 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
17410 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
17420 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
17430 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
17440 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
17450 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
17460 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
17470 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
17480 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
17490 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
174a0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
174b0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
174c0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
174d0 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
174e0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
174f0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
17500 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
17510 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
17520 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
17530 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
17540 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
17550 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74   assumes.** that
17560 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
17570 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
17580 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
17590 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72  ntil.** it retur
175a0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
175b0 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  r an error, and 
175c0 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65  that nFin is the
175d0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  .** number of pa
175e0 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ges the database
175f0 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61   file will conta
17600 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a  in after this .*
17610 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d  * process is com
17620 70 6c 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20  plete.  If nFin 
17630 69 73 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  is zero, it is a
17640 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69  ssumed that.** i
17650 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
17660 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
17670 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f   finite amount o
17680 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68  f times.** which
17690 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
176a0 65 6d 70 74 79 20 74 68 65 20 66 72 65 65 6c 69  empty the freeli
176b0 73 74 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f  st.  A full auto
176c0 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46  vacuum.** has nF
176d0 69 6e 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41  in>0.  A "PRAGMA
176e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63   incremental_vac
176f0 75 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30  uum" has nFin==0
17700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17710 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
17720 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
17730 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
17740 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e  astPg){.  Pgno n
17750 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
17760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17770 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
17780 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
17790 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
177a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
177b0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
177c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
177d0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
177e0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
177f0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
17800 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
17810 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
17820 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
17830 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
17840 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
17850 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
17860 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
17870 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
17880 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
17890 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
178a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
178b0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
178c0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
178d0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
178e0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
178f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
17910 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17920 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
17930 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
17940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17950 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17960 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
17970 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17980 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
17990 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
179a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
179b0 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
179c0 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
179d0 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
179e0 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
179f0 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
17a00 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
17a10 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
17a20 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
17a30 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
17a40 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
17a50 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
17a60 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
17a70 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
17a80 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
17a90 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
17aa0 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
17ab0 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
17ac0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
17ad0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
17ae0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
17af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
17b00 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
17b10 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
17b20 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
17b30 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
17b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17b50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17b60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17b70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17b80 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
17b90 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
17ba0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
17bb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17bc0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
17bd0 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
17be0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17bf0 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
17c00 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
17c10 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
17c20 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
17c30 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
17c40 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
17c50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
17c60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17c80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17c90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17ca0 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
17cb0 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
17cc0 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
17cd0 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
17ce0 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
17cf0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
17d00 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
17d10 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
17d20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
17d30 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
17d40 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46  ther hand, if nF
17d50 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68  in is greater th
17d60 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
17d70 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
17d80 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
17d90 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
17da0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
17db0 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
17dc0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
17dd0 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
17de0 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  /.      do {.   
17df0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
17e00 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
17e10 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
17e20 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
17e30 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30  ePg, &iFreePg, 0
17e40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
17e50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
17e70 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
17e80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
17e90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
17ea0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
17eb0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
17ec0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46        }while( nF
17ed0 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67  in!=0 && iFreePg
17ee0 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
17ef0 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
17f00 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
17f10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17f20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
17f30 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  astPg->pDbPage);
17f40 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17f50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f60 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
17f70 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
17f80 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
17f90 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46  age, iFreePg, nF
17fa0 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
17fb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17fc0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
17fd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17fe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18000 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
18010 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
18020 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
18030 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d   while( iLastPg=
18040 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18050 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
18060 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
18070 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tPg) ){.      if
18080 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
18090 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
180a0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
180b0 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72   *pPg;.        r
180c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
180d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
180e0 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  pPg, 0);.       
180f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18100 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18110 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
18130 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
18140 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
18150 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
18160 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
18170 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18190 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
181a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
181b0 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
181c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
181d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
181e0 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
181f0 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 20  r, iLastPg);.   
18200 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
18210 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
18220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18230 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
18240 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
18250 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
18260 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
18270 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
18280 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
18290 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
182a0 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
182b0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
182c0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
182d0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
182e0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
182f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
18300 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
18310 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
18320 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
18330 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
18340 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
18350 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
18360 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
18370 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
18380 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
18390 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
183a0 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
183b0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
183c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
183d0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
183e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
183f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18400 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18410 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
18420 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
18430 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
18440 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
18450 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18460 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
18470 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
18480 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
18490 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
184a0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
184b0 42 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67 65  Bt, 0, btreePage
184c0 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 20  count(pBt));.   
184d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
184e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
184f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18500 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
18510 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18520 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
18530 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
18540 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
18550 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
18560 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18580 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18590 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
185a0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
185b0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
185c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
185d0 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
185e0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
185f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
18600 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
18610 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
18620 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
18630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
18640 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
18650 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
18660 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
18670 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
18680 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
18690 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
186a0 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
186b0 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
186c0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
186d0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
186e0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
186f0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
18700 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
18710 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
18720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18730 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
18740 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
18750 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
18760 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
18770 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
18780 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
18790 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
187a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
187b0 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
187c0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
187d0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
187e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
187f0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
18800 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
18810 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
18820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18830 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
18840 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
18850 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
18860 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
18870 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
18880 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
18890 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
188a0 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
188b0 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
188c0 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
188d0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
188e0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
188f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
18900 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
18910 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eed */.    int n
18920 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Entry;        /*
18930 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
18940 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
18950 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
18960 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
18970 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
18980 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
18990 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
189a0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
189b0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
189c0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
189d0 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
189e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
189f0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
18a00 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
18a10 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
18a20 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
18a30 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
18a40 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
18a50 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
18a60 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
18a70 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
18a80 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
18a90 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
18aa0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
18ab0 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
18ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
18ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18ae0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
18af0 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
18b00 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18b10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
18b20 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  .    nEntry = pB
18b30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
18b40 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
18b50 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
18b60 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
18b70 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
18b80 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  ntry;.    nFin =
18b90 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
18ba0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
18bb0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
18bc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
18bd0 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
18be0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
18bf0 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
18c00 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
18c10 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
18c20 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
18c30 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
18c40 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
18c50 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
18c60 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
18c70 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
18c80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18c90 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
18ca0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
18cb0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
18cc0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
18cd0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
18ce0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
18cf0 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
18d00 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
18d10 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
18d20 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
18d30 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
18d40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18d50 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
18d60 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
18d70 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
18d80 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
18d90 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
18da0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
18db0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
18dc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
18dd0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18de0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
18df0 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  in);.      sqlit
18e00 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
18e10 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
18e20 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
18e30 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
18e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
18e70 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
18e80 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
18e90 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
18ea0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
18eb0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
18ec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18ed0 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
18ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18ef0 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
18f00 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
18f10 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
18f20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
18f30 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
18f40 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
18f50 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
18f60 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
18f70 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
18f80 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18f90 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
18fa0 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
18fb0 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
18fc0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
18fd0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
18fe0 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
18ff0 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
19000 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
19010 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
19020 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
19030 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
19040 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
19050 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
19060 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
19070 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
19080 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
19090 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
190a0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
190b0 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
190c0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
190d0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
190e0 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
190f0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
19100 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
19110 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
19120 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
19130 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
19140 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
19150 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
19160 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
19170 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
19180 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
19190 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
191a0 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
191b0 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
191c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
191d0 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
191e0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
191f0 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
19200 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
19210 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
19220 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
19230 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
19240 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
19250 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
19260 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
19270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19280 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
19290 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
192a0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
192b0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
192c0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
192d0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
192e0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
192f0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
19300 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
19310 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
19320 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19330 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
19340 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
19350 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
19360 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
19370 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
19380 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
19390 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
193a0 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
193b0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
193c0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
193d0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
193e0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
193f0 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
19400 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
19410 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
19420 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
19430 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
19440 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
19450 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
19460 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
19470 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
19480 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19490 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
194a0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
194b0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
194c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
194d0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
194e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
194f0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
19500 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
19510 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19520 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
19530 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19540 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
19550 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
19560 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
19570 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
19580 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
195a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
195b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
195c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
195d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
195e0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
195f0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
19600 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
19610 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
19620 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
19630 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
19640 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19650 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19660 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
19670 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
19680 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
19690 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
196a0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
196b0 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
196c0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
196d0 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
196e0 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
196f0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
19700 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19710 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19720 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
19730 28 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43  (p) );..  btreeC
19740 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
19750 42 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  Bt);.  if( p->in
19760 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
19770 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76   && p->db->activ
19780 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20  eVdbeCnt>1 ){.  
19790 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
197a0 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
197b0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
197c0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
197d0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
197e0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
197f0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
19800 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
19810 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
19820 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
19830 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
19840 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
19850 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
19860 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
19870 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
19880 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
19890 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
198a0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
198b0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
198c0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
198d0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
198e0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
198f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19900 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
19910 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
19920 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
19930 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
19940 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
19950 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
19960 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
19970 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
19980 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
19990 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
199a0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
199b0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
199c0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
199d0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
199e0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
199f0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
19a00 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
19a10 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
19a20 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
19a30 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
19a40 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19a50 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
19a60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
19a70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
19a80 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
19a90 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
19aa0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
19ab0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
19ac0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
19ad0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
19ae0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
19af0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
19b00 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
19b10 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
19b20 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
19b30 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
19b40 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
19b50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
19b60 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
19b70 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
19b80 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
19b90 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
19ba0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
19bb0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
19bc0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
19bd0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
19be0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
19bf0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
19c00 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
19c10 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
19c20 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
19c30 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
19c40 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
19c50 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
19c60 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
19c70 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
19c80 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
19c90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
19ca0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
19cb0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
19cc0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
19cd0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
19ce0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
19cf0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
19d00 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
19d10 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
19d20 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
19d30 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
19d40 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
19d50 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
19d60 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
19d70 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
19d80 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
19d90 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
19da0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
19db0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
19dc0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
19dd0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
19de0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
19df0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
19e00 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
19e10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
19e20 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
19e30 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
19e40 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
19e50 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
19e60 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
19e70 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
19e80 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
19e90 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
19ea0 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
19eb0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
19ec0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
19ed0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
19ee0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
19ef0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19f00 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
19f10 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
19f20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19f30 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
19f40 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
19f50 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
19f60 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
19f70 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
19f80 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
19f90 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
19fa0 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
19fb0 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
19fc0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
19fd0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
19fe0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
19ff0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1a000 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1a010 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1a020 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1a030 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1a040 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1a050 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1a060 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1a070 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1a080 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1a090 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1a0a0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1a0b0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1a0c0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1a0d0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1a0e0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1a0f0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1a100 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1a110 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1a120 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1a130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a140 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a150 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1a160 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1a170 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1a180 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1a190 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1a1a0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1a1b0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1a1c0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1a1d0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1a1e0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1a1f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1a200 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1a210 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1a220 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1a230 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1a240 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1a250 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a260 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1a270 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1a280 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1a290 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a2a0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1a2b0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1a2c0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1a2d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1a2e0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1a2f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a300 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1a310 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a320 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1a330 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1a340 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
1a350 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1a360 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1a370 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1a380 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a390 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1a3a0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1a3b0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1a3c0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1a3d0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1a3e0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1a3f0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1a400 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1a410 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1a420 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1a430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a440 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a450 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1a460 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1a470 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a480 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a490 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1a4a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a4b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
1a4c0 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
1a4d0 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
1a4e0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1a4f0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1a500 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1a510 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1a520 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1a530 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1a540 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1a550 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1a560 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
1a570 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
1a580 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
1a590 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
1a5a0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
1a5b0 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
1a5c0 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
1a5d0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
1a5e0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
1a5f0 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
1a600 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
1a610 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
1a620 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
1a630 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
1a640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1a650 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1a660 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1a670 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1a680 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1a690 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1a6a0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1a6b0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1a6c0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1a6d0 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
1a6e0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
1a6f0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
1a700 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
1a710 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1a720 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1a730 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1a740 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1a750 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1a760 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1a770 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1a780 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1a790 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1a7a0 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1a7b0 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1a7c0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1a7d0 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1a7e0 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1a7f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1a800 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1a810 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1a820 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1a830 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1a840 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1a850 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1a860 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1a870 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1a880 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1a890 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1a8a0 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1a8b0 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1a8c0 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1a8d0 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1a8e0 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1a8f0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1a900 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1a910 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1a920 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1a930 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1a940 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1a950 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1a960 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1a970 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1a980 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1a990 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1a9a0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1a9b0 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1a9c0 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1a9d0 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d  p;.  if( pBtree=
1a9e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1a9f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1aa00 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1aa10 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1aa20 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1aa30 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1aa40 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1aa50 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1aa60 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1aa70 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1aa80 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1aa90 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1aaa0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1aab0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1aac0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1aad0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1aae0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1aaf0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1ab00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ab10 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1ab20 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1ab30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1ab40 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1ab50 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1ab60 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1ab70 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1ab80 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1ab90 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1aba0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1abb0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1abc0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1abd0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1abe0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1abf0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1ac00 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1ac10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1ac20 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1ac30 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1ac40 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1ac50 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1ac60 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1ac70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ac80 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1ac90 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1aca0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1acb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1acc0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1acd0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1ace0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1acf0 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
1ad00 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
1ad10 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
1ad20 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
1ad30 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1ad40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1ad50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ad60 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
1ad70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1ad80 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1ad90 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20  (p, tripCode);. 
1ada0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
1adb0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
1adc0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1add0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1ade0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
1adf0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
1ae00 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
1ae10 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
1ae20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1ae30 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
1ae40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
1ae50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ae60 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1ae70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1ae80 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
1ae90 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
1aea0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
1aeb0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
1aec0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
1aed0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
1aee0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
1aef0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
1af00 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
1af10 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
1af20 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
1af30 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1af40 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
1af50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
1af60 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
1af70 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1af80 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
1af90 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
1afa0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
1afb0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
1afc0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1afd0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
1afe0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1aff0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
1b000 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
1b010 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1b020 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1b030 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
1b040 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
1b050 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
1b060 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
1b070 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b080 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1b090 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1b0a0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1b0b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b0c0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b0d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
1b0e0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
1b0f0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1b100 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1b110 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
1b120 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1b130 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1b140 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1b150 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1b160 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1b170 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1b180 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1b190 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1b1a0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1b1b0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1b1c0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1b1d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1b1e0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1b1f0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1b200 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1b210 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1b220 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1b230 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1b240 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1b250 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1b260 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1b270 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1b280 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1b290 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1b2a0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1b2b0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1b2c0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1b2d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1b2e0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1b2f0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1b300 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1b310 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1b320 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1b330 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1b340 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1b350 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1b360 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1b370 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1b380 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1b390 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1b3a0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1b3b0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1b3c0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1b3d0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1b3e0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1b3f0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1b400 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1b410 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1b420 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1b430 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1b440 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1b450 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1b460 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1b470 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1b480 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1b490 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1b4a0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1b4b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1b4c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1b4d0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1b4e0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1b4f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1b500 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b510 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1b520 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1b530 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1b540 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1b560 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1b570 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1b580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1b590 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1b5a0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1b5b0 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1b5c0 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1b5d0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1b5e0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1b5f0 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1b600 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1b610 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1b620 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1b630 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1b640 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1b650 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1b660 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1b670 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1b680 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1b690 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1b6a0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1b6b0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1b6c0 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1b6d0 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1b6e0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1b6f0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1b700 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1b710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b720 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1b730 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1b740 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1b750 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b760 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b770 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1b780 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1b790 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1b7a0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1b7b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1b7c0 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1b7d0 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1b7e0 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1b7f0 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1b800 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1b810 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1b820 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1b830 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1b840 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1b850 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1b860 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1b870 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1b880 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1b890 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1b8a0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1b8b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1b8c0 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1b8d0 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1b8e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1b8f0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1b900 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1b910 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1b920 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1b930 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1b940 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1b950 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1b960 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1b970 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1b980 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1b990 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1b9a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b9b0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1b9c0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1b9d0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1b9e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1b9f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1ba00 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1ba10 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1ba20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ba30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1ba40 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1ba50 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1ba60 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1ba70 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1ba80 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1ba90 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1baa0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1bab0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1bac0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1bad0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1bae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1baf0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1bb00 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1bb10 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1bb20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bb30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1bb40 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1bb50 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1bb60 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1bb70 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1bb80 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1bb90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bba0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1bbb0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1bbc0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1bbd0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1bbe0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1bbf0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1bc00 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1bc10 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1bc20 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1bc30 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1bc40 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1bc50 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1bc60 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1bc70 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1bc80 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1bc90 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1bca0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1bcb0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1bcc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bcd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1bce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bcf0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1bd00 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1bd10 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1bd20 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1bd30 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1bd40 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1bd50 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1bd60 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1bd70 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1bd80 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1bd90 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1bda0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1bdb0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1bdc0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1bdd0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1bde0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1bdf0 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1be00 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1be10 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1be20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1be30 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1be40 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1be50 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1be60 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1be70 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1be80 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1be90 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1bea0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1beb0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1bec0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1bed0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1bee0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1bef0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1bf00 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1bf10 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1bf20 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1bf30 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1bf40 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1bf50 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1bf60 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1bf70 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1bf80 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1bf90 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1bfa0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1bfb0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1bfc0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1bfd0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1bfe0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1bff0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1c000 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1c010 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1c020 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1c030 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1c040 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1c050 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1c060 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1c070 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1c080 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1c090 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1c0a0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1c0b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1c0c0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1c0d0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1c0e0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1c0f0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1c100 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1c110 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1c120 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1c130 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1c140 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1c150 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1c160 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1c170 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1c180 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1c190 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1c1a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1c1b0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1c1c0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1c1d0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1c1e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1c1f0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1c200 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1c210 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1c220 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1c230 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1c240 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1c250 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1c260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c270 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1c280 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1c290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1c2b0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1c2c0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c2e0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1c2f0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1c300 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1c330 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1c340 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1c350 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1c360 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1c370 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1c380 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1c390 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1c3a0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1c3d0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1c3e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1c3f0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1c400 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1c410 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1c420 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1c430 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1c440 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1c450 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1c460 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1c470 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1c480 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1c490 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1c4a0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1c4b0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1c4c0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1c4d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1c4e0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1c4f0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1c500 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1c510 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1c520 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1c530 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1c540 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1c550 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1c560 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1c570 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1c580 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1c590 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1c5a0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1c5b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1c5c0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1c5d0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1c5e0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1c5f0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1c600 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1c610 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1c620 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1c630 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1c640 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1c650 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1c660 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c670 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1c680 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1c690 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1c6a0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1c6b0 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1c6c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1c6d0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1c6e0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1c6f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1c700 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1c710 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1c720 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1c730 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
1c740 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
1c750 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
1c760 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1c770 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1c780 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1c790 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1c7a0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1c7b0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1c7c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1c7d0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1c7e0 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1c7f0 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1c800 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1c810 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1c820 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1c830 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1c840 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1c850 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1c860 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1c870 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
1c880 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1c890 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1c8a0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1c8b0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1c8c0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1c8d0 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1c8e0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1c8f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1c900 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
1c910 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
1c920 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1c930 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1c940 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1c950 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1c990 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c9c0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1c9d0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1c9e0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca10 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1ca20 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1ca30 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1ca40 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1ca50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1ca60 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1ca70 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1ca80 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1cab0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1cac0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1cad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1cae0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1caf0 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1cb00 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1cb10 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1cb20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1cb30 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1cb40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1cb50 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1cb60 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1cb70 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1cb80 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1cb90 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1cba0 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1cbb0 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1cbc0 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1cbd0 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1cbe0 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1cbf0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1cc00 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1cc10 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1cc20 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1cc30 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1cc40 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1cc50 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1cc60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1cc70 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1cc80 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1cc90 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
1cca0 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
1ccb0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
1ccc0 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
1ccd0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1cce0 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
1ccf0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
1cd00 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
1cd10 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
1cd20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
1cd30 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
1cd40 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
1cd50 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
1cd60 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
1cd70 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
1cd80 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
1cd90 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
1cda0 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
1cdb0 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
1cdc0 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
1cdd0 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
1cde0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1cdf0 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
1ce00 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
1ce10 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
1ce20 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
1ce30 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1ce40 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
1ce50 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
1ce60 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
1ce70 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
1ce80 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
1ce90 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
1cea0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
1ceb0 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
1cec0 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1ced0 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
1cee0 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
1cef0 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
1cf00 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
1cf10 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
1cf20 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1cf30 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
1cf40 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
1cf50 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
1cf60 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
1cf70 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
1cf80 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
1cf90 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
1cfa0 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
1cfb0 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1cfc0 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
1cfd0 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
1cfe0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1cff0 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
1d000 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
1d010 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
1d020 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
1d030 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1d040 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
1d050 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
1d060 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1d070 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
1d080 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
1d090 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
1d0a0 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
1d0b0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
1d0c0 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1d0d0 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
1d0e0 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
1d0f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1d100 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
1d110 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1d120 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1d130 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1d140 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1d150 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
1d160 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
1d170 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
1d180 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
1d190 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
1d1a0 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
1d1b0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
1d1c0 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
1d1d0 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
1d1e0 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1d1f0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1d200 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1d210 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
1d220 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
1d230 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
1d240 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
1d250 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
1d260 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
1d270 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
1d280 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1d290 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1d2a0 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1d2b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1d2c0 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
1d2d0 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
1d2e0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1d2f0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1d300 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d310 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1d320 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1d330 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1d340 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1d350 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1d360 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1d370 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1d380 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1d390 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1d3a0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1d3b0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1d3c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1d3d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1d3e0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1d3f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1d400 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1d410 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1d420 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1d430 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1d440 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1d450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d460 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1d470 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1d480 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1d490 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1d4a0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1d4b0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1d4c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d4d0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1d4e0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1d4f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1d500 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1d510 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1d520 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1d530 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
1d540 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1d550 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
1d560 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1d570 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1d580 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1d590 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d5a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d5b0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1d5c0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
1d5d0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1d5e0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
1d5f0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
1d600 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
1d610 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d620 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
1d630 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
1d640 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
1d650 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
1d660 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
1d670 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1d680 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1d690 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
1d6a0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
1d6b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d6c0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
1d6d0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
1d6e0 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
1d6f0 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
1d700 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
1d710 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
1d720 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1d730 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
1d740 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
1d750 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1d760 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
1d770 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
1d780 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
1d790 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
1d7a0 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
1d7b0 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
1d7c0 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
1d7d0 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
1d7e0 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
1d7f0 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
1d800 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
1d810 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
1d820 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
1d830 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
1d840 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
1d850 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
1d860 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
1d870 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
1d880 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
1d890 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1d8a0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1d8b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
1d8c0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1d8d0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1d8e0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
1d8f0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
1d900 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
1d910 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1d920 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1d930 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
1d940 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
1d950 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
1d960 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
1d970 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
1d980 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
1d990 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1d9a0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
1d9b0 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
1d9c0 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
1d9d0 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
1d9e0 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
1d9f0 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
1da00 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
1da10 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
1da20 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
1da30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1da40 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1da50 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
1da60 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
1da70 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1da80 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1da90 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1daa0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1dab0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1dac0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
1dad0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1dae0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1daf0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1db00 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1db10 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1db20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1db30 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1db40 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1db50 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1db60 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1db70 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1db80 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1db90 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1dbd0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1dbe0 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1dc20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1dc30 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1dc70 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1dc80 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1dc90 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1dca0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1dcb0 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1dcc0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd00 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1dd10 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1dd60 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1dd70 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1ddb0 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1ddc0 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
1ddd0 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
1dde0 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
1ddf0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1de00 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1de10 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
1de20 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
1de30 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
1de40 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
1de50 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
1de60 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
1de70 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
1de80 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
1de90 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
1dea0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
1deb0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
1dec0 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1ded0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1dee0 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
1def0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1df00 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
1df10 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1df20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
1df30 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1df40 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
1df50 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
1df60 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1df70 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1df80 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1df90 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1dfa0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1dfb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1dfc0 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1dfd0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1dfe0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1dff0 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1e000 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1e010 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1e020 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1e030 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1e040 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1e050 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1e060 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1e070 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1e080 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
1e090 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
1e0a0 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
1e0b0 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1e0c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1e0d0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
1e0e0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
1e0f0 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
1e100 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
1e110 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e120 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1e130 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1e140 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1e150 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e160 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e170 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e180 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1e190 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1e1a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e1b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1e1c0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
1e1d0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69  ALID ){.    *pSi
1e1e0 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
1e1f0 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
1e200 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
1e210 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1e220 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
1e230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e240 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1e250 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1e260 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1e270 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1e280 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1e290 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1e2a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1e2b0 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
1e2c0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1e2d0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1e2e0 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
1e2f0 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
1e300 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1e310 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1e320 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
1e330 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
1e340 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
1e350 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e360 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
1e370 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1e380 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
1e390 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
1e3a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
1e3b0 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
1e3c0 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
1e3d0 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
1e3e0 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
1e3f0 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
1e400 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
1e410 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
1e420 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
1e430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e440 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1e450 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e460 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
1e470 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e480 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e490 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1e4a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e4b0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
1e4c0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
1e4d0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1e4e0 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72  o.nData;.  retur
1e4f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e500 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1e510 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1e520 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1e530 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1e540 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1e550 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1e560 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1e570 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1e580 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1e590 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1e5a0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1e5b0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1e5c0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1e5d0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1e5e0 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1e5f0 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1e600 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1e610 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1e620 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1e630 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1e640 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1e650 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1e660 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1e670 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1e680 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1e690 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e6a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1e6b0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1e6c0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1e6d0 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1e6e0 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1e6f0 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1e700 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1e710 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1e720 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1e730 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1e740 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1e750 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1e760 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1e770 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1e780 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1e790 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1e7a0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1e7b0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1e7c0 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1e7d0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1e7e0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1e7f0 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1e800 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1e810 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1e820 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1e830 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1e840 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1e850 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1e860 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1e870 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1e880 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1e890 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1e8a0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1e8b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1e8c0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1e8d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1e900 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
1e910 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1e920 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1e930 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1e940 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
1e950 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1e960 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1e970 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1e980 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1e990 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e9b0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1e9c0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1e9d0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1e9e0 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1e9f0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1ea00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ea10 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1ea20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ea30 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1ea40 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1ea50 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1ea60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ea70 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1ea80 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1ea90 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1eaa0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1eab0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1eac0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1ead0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1eae0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1eaf0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1eb00 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1eb10 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1eb20 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1eb30 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1eb40 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1eb50 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1eb60 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1eb70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1eb80 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1eb90 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1eba0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1ebb0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1ebc0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1ebd0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1ebe0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1ebf0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1ec00 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1ec10 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1ec20 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1ec30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ec40 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1ec50 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1ec60 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1ec70 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
1ec80 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1ec90 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1eca0 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1ecb0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1ecc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ecd0 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1ece0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1ecf0 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1ed00 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1ed10 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1ed20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1ed30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ed40 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1ed50 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
1ed60 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
1ed70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ed80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1ed90 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1eda0 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1edb0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1edc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1edd0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1ede0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1edf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1ee00 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1ee10 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1ee20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1ee30 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1ee40 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1ee50 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1ee60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1ee70 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1ee80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1ee90 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1eea0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1eeb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
1eec0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1eed0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
1eee0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
1eef0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
1ef00 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
1ef10 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
1ef20 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
1ef30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
1ef40 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
1ef50 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
1ef60 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
1ef70 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1ef80 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
1ef90 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
1efa0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
1efb0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
1efc0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
1efd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1efe0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
1eff0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
1f000 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
1f010 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
1f020 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
1f030 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
1f040 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f050 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1f060 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
1f070 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
1f080 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
1f090 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
1f0a0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
1f0b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1f0c0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
1f0d0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1f0f0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
1f100 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1f130 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
1f140 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
1f150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
1f160 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
1f170 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
1f180 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
1f190 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
1f1a0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
1f1b0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
1f1c0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
1f1d0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1f1e0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
1f1f0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
1f200 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1f210 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f220 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
1f230 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1f240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f250 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f260 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
1f270 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
1f280 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
1f290 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
1f2a0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
1f2b0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
1f2c0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1f2d0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
1f2e0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
1f2f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f300 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f310 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f320 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
1f330 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
1f340 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1f350 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
1f360 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
1f370 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1f380 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
1f390 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
1f3a0 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
1f3b0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
1f3c0 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
1f3d0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1f3e0 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
1f3f0 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
1f400 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
1f410 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
1f420 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
1f430 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
1f440 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
1f450 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
1f460 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
1f470 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
1f480 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1f490 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
1f4a0 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
1f4b0 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
1f4c0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
1f4d0 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
1f4e0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
1f4f0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
1f500 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
1f510 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
1f520 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
1f530 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
1f540 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
1f550 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
1f560 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
1f570 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1f580 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1f590 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
1f5a0 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
1f5b0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
1f5c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1f5d0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
1f5e0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
1f5f0 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
1f600 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
1f610 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
1f620 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
1f630 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
1f640 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
1f650 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
1f660 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f670 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1f680 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1f690 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
1f6a0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
1f6b0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
1f6c0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
1f6d0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
1f6e0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
1f6f0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
1f700 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
1f710 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
1f720 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
1f730 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
1f740 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
1f750 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1f760 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
1f770 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
1f780 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
1f790 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
1f7a0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
1f7b0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
1f7c0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
1f7d0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
1f7e0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
1f7f0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
1f800 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
1f810 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1f820 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1f830 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1f840 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1f850 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
1f860 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
1f870 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
1f880 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
1f890 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
1f8a0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
1f8b0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
1f8c0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
1f8d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
1f8e0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
1f8f0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
1f900 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
1f910 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1f920 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1f930 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1f940 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1f950 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1f960 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1f970 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1f980 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1f990 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1f9a0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1f9b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f9c0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1f9d0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1f9e0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1f9f0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1fa00 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1fa10 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1fa20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1fa30 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1fa40 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1fa50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1fa60 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fa70 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1fa80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1fa90 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1faa0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1fab0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1fac0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1fad0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1fae0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1faf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1fb00 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1fb10 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1fb20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1fb30 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1fb40 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1fb50 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b  f( NEVER(offset+
1fb60 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
1fb70 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20  >info.nData) .  
1fb80 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
1fb90 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1fba0 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
1fbb0 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
1fbc0 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
1fbd0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
1fbe0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
1fbf0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
1fc00 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
1fc10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fc20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fc30 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
1fc40 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
1fc50 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
1fc60 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
1fc70 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
1fc80 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
1fc90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1fca0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1fcb0 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
1fcc0 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
1fcd0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
1fce0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1fcf0 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
1fd00 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
1fd10 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1fd20 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1fd30 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
1fd40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
1fd50 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
1fd60 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
1fd70 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
1fd80 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
1fd90 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1fda0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1fdb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1fdc0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
1fdd0 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
1fde0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1fdf0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
1fe00 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
1fe10 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
1fe20 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
1fe30 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1fe40 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
1fe50 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
1fe60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fe70 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1fe80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
1fe90 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1fea0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
1feb0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
1fec0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
1fed0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1fee0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
1fef0 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
1ff00 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
1ff10 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
1ff20 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
1ff30 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1ff40 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
1ff50 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
1ff60 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
1ff70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1ff80 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
1ff90 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
1ffa0 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
1ffb0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
1ffc0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
1ffd0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
1ffe0 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
1fff0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
20000 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
20010 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
20020 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
20030 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
20040 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
20050 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
20060 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
20070 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
20080 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
20090 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
200a0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
200b0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
200c0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
200d0 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
200e0 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c    /* nOvfl is al
200f0 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20  ways positive.  
20100 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c  If it were zero,
20110 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f   fetchPayload wo
20120 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a  uld have.      *
20130 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74  * been used inst
20140 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ead of this rout
20150 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ine. */.      if
20160 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20  ( ALWAYS(nOvfl) 
20170 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
20180 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
20190 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
201a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
201b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
201c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
201d0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
201e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
201f0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
20200 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
20210 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
20220 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
20230 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
20240 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
20250 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
20260 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
20270 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
20280 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
20290 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
202a0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
202b0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
202c0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
202d0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
202e0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
202f0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
20300 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
20310 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
20320 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
20330 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
20340 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20350 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20360 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
20370 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
20380 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
20390 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
203a0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
203b0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
203c0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
203d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
203e0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
203f0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
20400 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
20410 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20420 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
20430 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20440 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
20450 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
20460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
20470 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
20480 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
20490 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
204a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
204b0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
204c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
204d0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
204e0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
204f0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
20500 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
20510 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
20520 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
20530 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
20540 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
20550 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
20560 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
20570 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
20580 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
20590 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
205a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
205b0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
205c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
205d0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
205e0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
205f0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
20600 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
20610 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
20620 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
20630 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
20640 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
20650 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
20660 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
20670 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
20680 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
20690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
206a0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
206b0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
206c0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
206d0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
206e0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
206f0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
20700 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
20710 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
20720 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
20730 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
20740 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
20750 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
20760 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
20770 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
20780 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
20790 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
207a0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
207b0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
207c0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
207d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
207e0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
207f0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
20800 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
20810 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
20820 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
20830 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
20840 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
20850 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
20860 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
20870 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
20880 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
20890 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
208a0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
208b0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
208c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
208d0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
208e0 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
208f0 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
20900 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
20910 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
20920 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
20930 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
20940 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
20950 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
20960 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
20970 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
20980 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
20990 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
209a0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
209b0 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
209c0 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
209d0 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
209e0 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
209f0 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
20a00 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
20a10 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
20a20 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
20a30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
20a40 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20   if( eOp==0     
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
20a80 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
20a90 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
20ad0 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
20ae0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
20af0 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
20b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
20b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
20b20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
20b30 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
20b40 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
20b50 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
20b60 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
20b70 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
20b80 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
20b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
20ba0 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  5) */.        ){
20bb0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
20bc0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
20bd0 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
20be0 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
20bf0 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
20c00 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
20c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20c20 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
20c30 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
20c40 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
20c50 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
20c60 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
20c70 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
20c80 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
20c90 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
20ca0 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
20cb0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
20cc0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
20cd0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
20ce0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
20cf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
20d00 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
20d10 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
20d20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
20d30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20d50 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
20d60 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
20d70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
20d80 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
20d90 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
20da0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
20db0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
20dc0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
20dd0 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
20de0 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
20df0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20e00 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
20e10 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20e20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
20e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20e40 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
20e50 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
20e60 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
20e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
20e80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20e90 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
20ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20eb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20ec0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20ed0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
20ee0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
20ef0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
20f00 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
20f10 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
20f20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
20f30 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
20f40 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
20f50 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
20f60 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
20f70 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
20f80 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
20f90 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
20fa0 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
20fb0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
20fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
20fd0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
20fe0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
20ff0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
21000 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
21010 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
21020 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
21030 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
21040 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
21050 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
21060 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
21070 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
21080 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
21090 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
210a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
210b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
210c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
210d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
210e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
210f0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
21100 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
21110 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
21120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21130 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21140 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
21150 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21160 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
21170 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
21180 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
21190 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
211a0 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
211b0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
211c0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
211d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
211e0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
211f0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
21200 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
21210 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
21220 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
21230 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
21240 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
21250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
21260 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
21270 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
21280 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
21290 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
212a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
212b0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
212c0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
212d0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
212e0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
212f0 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
21300 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
21310 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
21320 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
21330 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
21340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
21350 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
21360 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21370 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
21380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
21390 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
213a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
213b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
213c0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
213d0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
213e0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
213f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21410 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21420 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
21430 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
21440 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
21450 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21460 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
21470 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
21480 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
21490 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
214a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
214b0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
214c0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
214d0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
214e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
214f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
21500 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
21510 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
21520 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
21530 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
21540 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
21550 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
21560 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
21570 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
21580 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
21590 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
215a0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
215b0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
215c0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
215d0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
215e0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
215f0 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
21600 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
21610 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
21620 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
21630 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
21640 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
21650 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
21660 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21670 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
21680 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
21690 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
216a0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
216b0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
216c0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
216d0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
216e0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
216f0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
21700 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
21710 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
21720 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
21730 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
21740 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
21750 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
21760 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
21770 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
21780 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
21790 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
217a0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
217b0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
217c0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
217d0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
217e0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
217f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
21800 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
21810 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
21820 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
21830 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
21840 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
21850 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
21860 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
21870 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
21880 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
21890 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
218a0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
218b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
218c0 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
218d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
218e0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
218f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
21900 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
21910 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
21920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
21930 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
21940 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
21950 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
21960 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
21970 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
21980 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
21990 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
219a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
219b0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
219c0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
219d0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
219e0 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
219f0 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
21a00 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
21a10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21a20 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
21a30 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21a40 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
21a60 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21a70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
21a80 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21a90 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
21aa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
21ab0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
21ac0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
21ad0 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
21ae0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29  ->info.nSize==0)
21af0 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72   ){.    btreePar
21b00 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
21b10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21b20 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
21b30 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
21b50 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
21b60 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
21b70 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
21b80 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
21b90 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
21ba0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
21bb0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
21bc0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
21bd0 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
21be0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
21bf0 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
21c00 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
21c10 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
21c20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
21c30 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
21c40 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
21c50 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
21c60 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
21c70 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d  assert( nLocal<=
21c80 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  nKey );.  }.  *p
21c90 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
21ca0 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
21cb0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
21cc0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
21cd0 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
21ce0 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
21cf0 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
21d00 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
21d10 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
21d20 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
21d30 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
21d40 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
21d50 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
21d60 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
21d70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
21d80 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
21d90 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
21da0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
21db0 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
21dc0 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
21dd0 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
21de0 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
21df0 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
21e00 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
21e10 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
21e20 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
21e30 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
21e40 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
21e50 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
21e60 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
21e70 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
21e80 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
21e90 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
21ea0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
21eb0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
21ec0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
21ed0 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
21ee0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
21ef0 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
21f00 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
21f10 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
21f20 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
21f30 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
21f40 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
21f50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21f60 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
21f70 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
21f80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
21f90 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21fa0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
21fb0 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
21fc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
21fd0 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
21fe0 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
21ff0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
22000 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
22010 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n p;.}.const voi
22020 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
22030 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
22040 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
22050 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
22060 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
22070 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22080 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22090 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
220a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
220b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
220c0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
220d0 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
220e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
220f0 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
22100 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
22110 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
22120 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
22130 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n p;.}.../*.** M
22140 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
22150 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
22160 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
22170 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
22180 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
22190 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
221a0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
221b0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
221c0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
221d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
221e0 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
221f0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
22200 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
22210 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
22220 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
22230 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
22240 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
22250 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
22260 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
22270 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
22280 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
22290 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
222a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
222b0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
222c0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
222d0 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
222e0 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
222f0 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
22300 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
22310 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22320 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
22330 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22340 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22350 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22360 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22370 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
22380 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
22390 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
223a0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
223b0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
223c0 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
223d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
223e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
223f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
22400 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
22410 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
22420 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
22430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
22440 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
22450 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
22460 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
22470 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
22480 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
22490 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
224a0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
224b0 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
224c0 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
224d0 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
224e0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
224f0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
22500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22510 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
22520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22530 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  OK;.}..#if 0./*.
22540 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
22550 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
22560 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
22570 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
22580 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
22590 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
225a0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
225b0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
225c0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
225d0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
225e0 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
225f0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
22600 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
22610 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
22620 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
22630 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
22640 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
22650 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
22660 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
22670 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
22680 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
22690 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
226a0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
226b0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
226c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
226d0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
226e0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
226f0 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
22700 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
22710 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
22720 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
22730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
22740 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
22750 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
22760 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
22770 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
22780 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
22790 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
227a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
227b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
227c0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
227d0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
227e0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
227f0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
22800 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
22810 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
22820 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
22830 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
22840 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
22850 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
22860 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
22870 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
22880 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
22890 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
228a0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
228b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
228c0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
228d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
228e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
228f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22910 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22920 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
22930 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
22940 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
22950 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22960 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20  r->iPage] );..  
22970 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69 73  /* UPDATE: It is
22980 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
22990 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69  le for the condi
229a0 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74  tion tested by t
229b0 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62  he assert.  ** b
229c0 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75  elow to be untru
229d0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
229e0 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
229f0 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  t. This can occu
22a00 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75  r if.  ** one cu
22a10 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65  rsor has modifie
22a20 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20 77  d page pParent w
22a30 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65  hile a reference
22a40 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a   to it is held .
22a50 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64    ** by a second
22a60 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63   cursor. Which c
22a70 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
22a80 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
22a90 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69  is linked.  ** i
22aa0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
22ab0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
22ac0 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  re in a corrupt 
22ad0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69  database.  */.#i
22ae0 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72 65  f 0.  assertPare
22af0 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
22b00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22b10 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
22b20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22b30 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
22b40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22b50 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
22b60 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65    );.#endif.  te
22b70 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
22b80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
22b90 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
22ba0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
22bb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65  ->nCell );..  re
22bc0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
22bd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22be0 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
22bf0 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
22c00 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
22c10 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22c20 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 0;.}../*.** M
22c30 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
22c40 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
22c50 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
22c60 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
22c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
22c80 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
22c90 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
22ca0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
22cb0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
22cc0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
22cd0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
22ce0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
22cf0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
22d00 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
22d10 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
22d20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
22d30 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
22d40 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
22d50 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
22d60 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
22d70 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
22d80 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
22d90 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
22da0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
22db0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
22dc0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
22dd0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
22de0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
22df0 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
22e00 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
22e10 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
22e20 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
22e30 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
22e40 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
22e50 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
22e60 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
22e70 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
22e80 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
22e90 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
22ea0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
22eb0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
22ec0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
22ed0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
22ee0 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
22ef0 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
22f00 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
22f10 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
22f20 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
22f30 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
22f40 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
22f50 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
22f60 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
22f70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
22f80 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
22f90 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
22fa0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
22fb0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
22fc0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
22fd0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
22fe0 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
22ff0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
23000 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
23010 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
23020 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
23030 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
23040 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
23050 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
23060 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
23070 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
23080 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
23090 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
230a0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
230b0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
230c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
230d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
230e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
230f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23100 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
23110 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
23120 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
23130 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
23140 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
23150 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
23160 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
23170 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
23180 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
23190 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
231a0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
231b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
231c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
231d0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
231e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
231f0 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
23200 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
23210 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
23220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23230 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
23240 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
23250 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
23260 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e>=0 ){.    int 
23270 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
23280 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
23290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
232a0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
232b0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
232c0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
232d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
232e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
232f0 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
23300 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
23310 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
23320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
23340 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
23350 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
23360 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
23370 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  ge[0]);.    if( 
23380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23390 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
233a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
233b0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
233c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
233d0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
233e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75  ;..    /* If pCu
233f0 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
23400 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
23410 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
23420 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
23430 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64  .    ** expected
23440 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
23450 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
23460 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
23470 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a  eyInfo is.    **
23480 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
23490 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
234a0 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
234b0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
234c0 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e,.    ** return
234d0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
234e0 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  PT error.  */.  
234f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23500 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
23510 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70  y==1 || pCur->ap
23520 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
23530 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
23540 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
23550 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  )!=pCur->apPage[
23560 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
23570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23580 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23590 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
235a0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
235b0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20  root page is of 
235c0 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
235d0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74  . This must be t
235e0 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20  he.  ** case as 
235f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  the call to this
23600 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
23610 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70  oaded the root-p
23620 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a  age (either.  **
23630 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20   this call or a 
23640 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74  previous invocat
23650 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20  ion) would have 
23660 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
23670 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  ion .  ** if the
23680 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65   assumption were
23690 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69   not true, and i
236a0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
236b0 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20  e for the flags 
236c0 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61  .  ** byte to ha
236d0 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
236e0 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73   while this curs
236f0 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  or is holding a 
23700 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74  reference.  ** t
23710 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a  o the page.  */.
23720 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
23730 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
23740 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
23750 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
23760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
23770 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28  oot->isInit && (
23780 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
23790 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)==pRoot->intKe
237a0 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69  y );..  pCur->ai
237b0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
237c0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
237d0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
237e0 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
237f0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
23800 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
23810 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
23820 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
23830 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
23840 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
23850 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
23860 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23870 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
23880 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
23890 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
238a0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
238b0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
238c0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
238d0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
238e0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
238f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
23900 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
23910 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
23920 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
23930 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
23940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23950 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
23960 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
23970 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
23980 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
23990 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
239a0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
239b0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
239c0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
239d0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
239e0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
239f0 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
23a00 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
23a10 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
23a20 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
23a30 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
23a40 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
23a50 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
23a60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23a70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
23a80 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23a90 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23aa0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23ab0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23ac0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
23ad0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
23ae0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
23af0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23b00 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
23b10 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
23b20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23b30 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
23b40 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
23b50 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
23b60 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
23b70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23b80 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
23b90 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
23ba0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
23bb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23bc0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
23bd0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
23be0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
23bf0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
23c00 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
23c10 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
23c20 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
23c30 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
23c40 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
23c50 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23c60 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
23c70 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
23c80 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
23c90 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
23ca0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
23cb0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
23cc0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
23cd0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
23ce0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
23cf0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
23d00 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
23d10 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
23d20 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
23d30 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
23d40 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
23d50 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
23d60 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
23d70 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
23d80 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
23d90 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
23da0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
23db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
23dc0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
23dd0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
23de0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23df0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23e00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23e10 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23e20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
23e30 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
23e40 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
23e50 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
23e60 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
23e70 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
23e80 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
23e90 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
23ea0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
23eb0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
23ec0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
23ed0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
23ee0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
23ef0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
23f10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23f20 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
23f30 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
23f40 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23f50 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
23f60 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
23f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23f80 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23f90 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
23fa0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
23fb0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
23fc0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
23fd0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
23fe0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
23ff0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
24000 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
24010 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
24020 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
24030 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
24040 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
24050 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
24060 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
24070 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
24080 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24090 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
240a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
240b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
240c0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
240d0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
240e0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
240f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24100 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
24110 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24120 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
24130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24140 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
24150 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
24160 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24170 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
24180 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
24190 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
241a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
241b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
241c0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
241d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
241e0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
241f0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
24200 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24210 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
24220 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
24230 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
24240 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
24250 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
24260 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
24270 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
24280 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
24290 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
242a0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
242b0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
242c0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
242d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
242e0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
242f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
24300 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
24310 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24320 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24350 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
24360 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
24370 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
24380 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
24390 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
243a0 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
243b0 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
243c0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
243d0 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d  >eState && pCur-
243e0 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65  >atLast ){.#ifde
243f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
24400 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
24410 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
24420 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
24430 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
24440 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
24450 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
24460 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
24470 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
24480 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
24490 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
244a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
244b0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
244c0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
244d0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
244e0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
244f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24500 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
24510 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24520 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
24530 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24540 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24550 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
24560 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
24570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
24580 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
24590 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
245a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
245b0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
245c0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
245d0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
245e0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
245f0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
24600 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24610 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
24620 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
24630 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
24640 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24650 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24660 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
24670 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
24680 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
24690 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
246a0 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20     pCur->atLast 
246b0 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  = rc==SQLITE_OK 
246c0 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ?1:0;.    }.  }.
246d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
246e0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
246f0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
24700 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
24710 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
24720 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
24730 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
24740 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
24750 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
24760 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
24770 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
24780 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
24790 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
247a0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
247b0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
247c0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
247d0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
247e0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
247f0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
24800 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
24810 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
24820 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
24830 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
24840 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
24850 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
24860 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
24870 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
24880 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
24890 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
248a0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
248b0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
248c0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
248d0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
248e0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
248f0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
24900 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
24910 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
24920 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
24930 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
24940 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
24950 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
24960 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
24970 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
24980 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
24990 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
249a0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
249b0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
249c0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
249d0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
249e0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
249f0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
24a00 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
24a10 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
24a20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
24a30 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
24a40 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
24a50 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
24a60 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
24a70 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
24a80 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
24a90 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
24aa0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
24ac0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
24ad0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
24ae0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
24af0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
24b00 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
24b10 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
24b20 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
24b30 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
24b40 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
24b50 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
24b60 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
24b70 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
24b80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
24b90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
24ba0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
24bb0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
24bc0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
24bd0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
24be0 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
24bf0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
24c00 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
24c10 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
24c20 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
24c30 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
24c40 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
24c50 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
24c60 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
24c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
24c80 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
24c90 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
24ca0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
24cb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24cc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24cd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24ce0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
24cf0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
24d00 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
24d10 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
24d20 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
24d30 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
24d40 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
24d50 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
24d60 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
24d70 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
24d80 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
24d90 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
24da0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
24db0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
24dc0 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
24dd0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24de0 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
24df0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
24e00 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
24e10 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
24e20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
24e30 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
24e40 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
24e50 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
24e60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24e70 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
24e80 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
24e90 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
24ea0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
24eb0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
24ec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24ed0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
24ee0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
24ef0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24f00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24f10 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
24f20 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
24f30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24f40 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
24f50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
24f60 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
24f70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24f80 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
24f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24fa0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24fb0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
24fc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24fd0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
24fe0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
24ff0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
25000 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
25010 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
25020 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
25030 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
25040 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25050 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
25060 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25070 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
25080 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
25090 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
250a0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
250b0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
250c0 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20 20 20 20  , upr, idx;.    
250d0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
250e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
250f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
25100 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
25110 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20   int c;..    /* 
25120 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
25130 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
25140 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
25150 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
25160 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
25170 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
25180 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
25190 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
251a0 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
251b0 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
251c0 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
251d0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
251e0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
251f0 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
25200 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
25210 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
25220 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
25230 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
25240 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
25250 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
25260 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
25270 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
25280 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
25290 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
252a0 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
252b0 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
252c0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
252d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
252e0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
252f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25300 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
25310 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
25320 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
25330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
25340 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
25350 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
25360 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25370 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
25380 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  = upr);.    }els
25390 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
253a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
253b0 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20  ] = (u16)(idx = 
253c0 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
253d0 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
253e0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
253f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
25410 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
25420 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
25430 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
25440 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49 64   idx==pCur->aiId
25450 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  x[pCur->iPage] )
25460 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
25470 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
25480 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
25490 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
254a0 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
254b0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
254c0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
254d0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
254e0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
254f0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
25500 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
25510 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
25520 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
25530 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
25540 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
25550 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
25560 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
25570 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
25580 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
25590 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
255a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
255b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
255c0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
255d0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
255e0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
255f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25600 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
25610 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
25620 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
25630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
25640 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
25650 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
25660 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
25670 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
25680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
25690 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
256a0 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
256b0 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
256c0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
256d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
256e0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
256f0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
25700 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
25710 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
25720 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
25730 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
25740 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
25750 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
25760 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
25770 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
25780 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
25790 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
257a0 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
257b0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
257c0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
257d0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
257e0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
257f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
25800 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
25810 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
25820 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
25830 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
25840 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
25850 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
25860 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25870 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
25880 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
25890 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
258a0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 0a  max1bytePayload.
258b0 20 20 20 20 20 20 20 20 20 2f 2a 20 26 26 20 28           /* && (
258c0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29 3c 70 50 61  pCell+nCell)<pPa
258d0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a  ge->aDataEnd */.
258e0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
258f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
25900 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
25910 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
25920 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
25930 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
25940 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
25950 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
25960 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
25970 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
25980 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
25990 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
259a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
259b0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
259c0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
259d0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
259e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
259f0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
25a00 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
25a10 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
25a20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
25a30 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
25a40 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
25a50 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
25a60 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
25a70 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
25a80 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2f  ocal.          /
25a90 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c  * && (pCell+nCel
25aa0 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61  l+2)<=pPage->aDa
25ab0 74 61 45 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  taEnd */.       
25ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
25ad0 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
25ae0 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
25af0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
25b00 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
25b10 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
25b20 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
25b30 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
25b40 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
25b50 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
25b60 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
25b70 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
25b80 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
25b90 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
25ba0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
25bb0 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
25bc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25bd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
25be0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
25bf0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
25c00 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
25c10 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
25c20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
25c30 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
25c40 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
25c50 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
25c60 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
25c70 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
25c80 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
25c90 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
25ca0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
25cb0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
25cc0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
25cd0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
25ce0 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
25cf0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
25d00 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
25d10 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
25d20 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
25d30 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
25d40 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
25d50 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
25d60 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
25d70 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
25d80 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
25d90 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
25da0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
25db0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
25dc0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
25dd0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
25de0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
25df0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
25e00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
25e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
25e20 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
25e30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25e40 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
25e50 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
25e60 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
25e70 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
25e80 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
25e90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25eb0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25ed0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25ee0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25ef0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
25f00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
25f10 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
25f20 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
25f30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25f40 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
25f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25f60 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
25f70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25f80 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
25f90 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
25fa0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
25fb0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
25fc0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
25fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25fe0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
25ff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26000 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
26010 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
26020 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
26030 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
26040 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
26050 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
26060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26070 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
26080 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
26090 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
260a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
260b0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
260c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
260d0 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 28 6c  = (u16)(idx = (l
260e0 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20  wr+upr)/2);.    
260f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
26100 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
26110 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
26120 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
26130 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26140 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
26150 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
26160 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
26170 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
26180 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
26190 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
261a0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
261b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
261c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
261d0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
261e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
261f0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
26200 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
26210 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
26220 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
26230 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
26240 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
26250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26260 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26270 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
26280 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
26290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
262a0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
262b0 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
262c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
262d0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
262e0 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
262f0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26300 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
26310 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
26320 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
26330 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
26340 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
26350 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
26360 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
26370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
26380 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
26390 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
263a0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
263b0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
263c0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
263d0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
263e0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
263f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
26400 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
26410 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
26420 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
26430 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
26440 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
26450 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
26460 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
26470 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
26480 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
26490 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
264a0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
264b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
264c0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
264d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
264e0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
264f0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
26500 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
26510 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
26520 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
26530 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
26540 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
26550 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
26560 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
26570 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
26580 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
26590 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
265a0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
265b0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
265c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
265d0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
265e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
265f0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
26600 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
26610 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
26620 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
26630 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
26640 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
26650 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
26660 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
26670 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
26680 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
26690 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
266a0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
266b0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
266c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
266d0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
266e0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
266f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26700 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26710 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
26720 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
26730 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
26740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
26750 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
26760 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
26770 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
26780 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
26790 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
267a0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
267b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
267c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
267d0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70  pNext>0 ){.    p
267e0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
267f0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
26800 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26810 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
26820 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
26830 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
26840 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26850 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
26860 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
26870 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
26880 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
26890 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nit );..  /* If 
268a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
268b0 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
268c0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
268d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
268e0 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
268f0 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
26900 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
26910 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
26920 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
26930 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
26940 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
26950 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
26960 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
26970 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
26980 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
26990 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
269a0 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
269b0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
269c0 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
269d0 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
269e0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
269f0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
26a00 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
26a10 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
26a20 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
26a30 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
26a40 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
26a50 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
26a60 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
26a70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
26a80 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
26a90 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
26aa0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
26ab0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
26ac0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
26ad0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
26ae0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
26af0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
26b00 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
26b10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
26b20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
26b30 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
26b40 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
26b50 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
26b60 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
26b70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
26b80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26b90 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
26ba0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
26bb0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
26bc0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
26bd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26be0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
26bf0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26c00 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
26c10 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
26c20 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
26c30 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
26c40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26c50 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
26c60 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
26c70 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
26c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
26c90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
26ca0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
26cb0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
26cc0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
26cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26ce0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
26cf0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
26d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
26d10 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
26d20 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
26d30 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
26d40 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
26d50 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
26d60 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
26d70 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
26d80 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
26d90 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
26da0 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
26db0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
26dc0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
26dd0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
26de0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
26df0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
26e00 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
26e10 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
26e20 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
26e30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
26e40 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
26e50 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26e60 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26e70 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
26e80 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
26e90 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
26ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26eb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
26ec0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
26ed0 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
26ee0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
26ef0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
26f00 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
26f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26f20 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
26f30 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
26f40 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
26f50 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
26f60 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
26f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26f80 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
26f90 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
26fa0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26fb0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
26fc0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
26fd0 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
26fe0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26ff0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
27000 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27010 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
27020 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
27030 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
27040 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
27050 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27060 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27070 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
27080 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
27090 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
270a0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
270b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
270c0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
270d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
270e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
270f0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
27100 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
27110 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27120 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27130 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
27140 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
27150 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
27160 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
27170 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
27180 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
27190 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
271a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
271b0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
271c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
271d0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
271e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
271f0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
27200 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27210 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
27220 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
27230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27250 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
27260 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
27270 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
27280 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
27290 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
272a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
272b0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
272c0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
272d0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
272e0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
272f0 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
27300 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
27310 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
27320 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
27330 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
27340 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
27350 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
27360 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
27370 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
27380 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
27390 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
273a0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
273b0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
273c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
273d0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
273e0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
273f0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
27400 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
27410 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
27420 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
27430 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
27440 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
27450 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
27460 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
27470 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
27480 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
27490 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
274a0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
274b0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
274c0 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
274d0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
274e0 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
274f0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
27500 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
27510 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
27520 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
27530 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
27540 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
27550 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
27560 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
27570 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
27580 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
27590 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
275a0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
275b0 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
275c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
275d0 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
275e0 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
275f0 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
27600 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
27610 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
27620 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
27630 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
27640 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
27650 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
27660 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
27670 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
27680 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
27690 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
276a0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
276b0 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
276c0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
276d0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
276e0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
276f0 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
27700 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
27710 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
27720 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
27730 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
27740 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
27750 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
27760 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
27770 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
27780 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
27790 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
277a0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
277b0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
277c0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
277d0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
277e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
277f0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
27800 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27810 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
27820 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
27830 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
27840 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
27850 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e  ecount(pBt);.  n
27860 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
27870 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
27880 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
27890 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
278a0 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
278b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
278c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
278d0 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
278e0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
278f0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
27900 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
27910 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
27920 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
27930 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
27940 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
27950 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
27960 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
27970 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
27980 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
27990 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
279a0 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
279b0 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
279c0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
279d0 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
279e0 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
279f0 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
27a00 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
27a10 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
27a20 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
27a30 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
27a40 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
27a50 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
27a60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
27a70 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
27a80 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78  ct && nearby<=mx
27a90 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38  Page ){.      u8
27aa0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73   eType;.      as
27ab0 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
27ac0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27ad0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
27ae0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
27af0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
27b00 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
27b10 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27b20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27b30 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
27b40 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
27b50 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
27b60 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
27b70 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65       *pPgno = ne
27b80 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  arby;.    }.#end
27b90 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
27ba0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
27bb0 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
27bc0 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
27bd0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
27be0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
27bf0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
27c00 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
27c10 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
27c20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
27c30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
27c40 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
27c50 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27c60 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
27c70 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
27c80 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
27c90 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
27ca0 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
27cb0 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
27cc0 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
27cd0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
27ce0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
27cf0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
27d00 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
27d10 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
27d20 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
27d30 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
27d40 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
27d50 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
27d60 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
27d70 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
27d80 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
27d90 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
27da0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
27db0 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
27dc0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
27dd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27de0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
27df0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
27e00 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
27e10 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
27e20 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
27e30 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
27e40 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
27e50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27e60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27e70 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
27e80 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
27e90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
27ea0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
27eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
27ec0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
27ed0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
27ee0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27ef0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
27f10 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
27f20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27f30 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
27f40 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20  0 );..      k = 
27f50 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
27f60 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20  ->aData[4]); /* 
27f70 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  # of leaves on t
27f80 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  his trunk page *
27f90 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  /.      if( k==0
27fa0 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
27fb0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27fc0 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
27fd0 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
27fe0 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
27ff0 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
28000 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
28010 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
28020 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
28030 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
28040 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
28050 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
28060 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
28070 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
28080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28090 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
280a0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
280b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
280c0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
280d0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
280e0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
280f0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
28100 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
28110 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
28120 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
28130 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
28140 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
28150 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
28160 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
28170 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
28180 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
28190 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
281a0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
281b0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
281c0 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
281d0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
281e0 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
281f0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
28200 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
28210 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
28220 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
28230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
28240 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
28250 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
28260 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
28270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28280 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
28290 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
282a0 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d  hList && nearby=
282b0 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =iTrunk ){.     
282c0 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
282d0 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
282e0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
282f0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
28300 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
28310 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
28320 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
28330 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
28340 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28350 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d   assert( *pPgno=
28360 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20  =iTrunk );.     
28370 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
28380 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
28390 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
283a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
283b0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
283c0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
283d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
283e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
283f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
28400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28410 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
28420 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
28430 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
28440 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
28450 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
28460 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
28470 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
28480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28490 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
284a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
284b0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
284c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
284d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
284e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
284f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
28500 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
28510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28520 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
28530 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
28540 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
28550 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
28560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28580 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
28590 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
285a0 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
285b0 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
285c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
285d0 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
285e0 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
285f0 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
28600 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
28610 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
28620 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
28630 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
28640 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
28650 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
28660 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
28670 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
28680 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
28690 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
286a0 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
286b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
286c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
286d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
286e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
286f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
28700 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
28710 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
28720 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
28730 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
28740 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65  GetPage(pBt, iNe
28750 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
28760 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
28770 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28780 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28790 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
287a0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
287b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
287c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
287d0 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
287e0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
287f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28810 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
28820 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
28830 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
28840 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28850 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
28860 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
28870 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
28880 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
28890 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
288a0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
288b0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
288c0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
288d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
288e0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
288f0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
28900 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
28910 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
28920 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
28930 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
28940 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
28950 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
28960 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28970 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
28980 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
28990 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
289a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
289b0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
289c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
289d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
289e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
289f0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
28a00 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
28a10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28a20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
28a30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
28a40 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
28a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28a60 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
28a70 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
28a80 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
28a90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28ab0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
28ac0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
28ad0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
28ae0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
28af0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
28b00 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
28b10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
28b20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
28b30 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
28b40 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
28b50 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
28b60 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
28b70 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
28b80 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
28b90 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
28ba0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
28bb0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
28bc0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
28bd0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64  .          int d
28be0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
28bf0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
28c00 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
28c10 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
28c20 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
28c30 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
28c40 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
28c50 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
28c60 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
28c70 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
28c80 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
28c90 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
28ca0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
28cb0 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
28cc0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
28cd0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
28ce0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
28cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28d10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28d20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
28d30 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
28d40 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
28d50 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
28d60 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
28d70 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
28d80 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
28d90 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
28da0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
28db0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28dc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28dd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
28de0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
28df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28e00 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
28e10 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
28e20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
28e30 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e  List || iPage==n
28e40 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
28e50 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
28e60 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
28e70 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
28e80 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
28e90 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
28ea0 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
28eb0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
28ec0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
28ed0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
28ee0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28ef0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
28f00 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
28f10 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
28f20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28f30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28f40 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
28f50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
28f60 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
28f70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
28f80 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
28f90 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
28fa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
28fb0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
28fc0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
28fd0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
28fe0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
28ff0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
29000 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
29010 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
29020 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
29030 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20  (pBt, *pPgno);. 
29040 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
29050 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29060 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
29070 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
29080 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
29090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
290a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
290b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
290c0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
290d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
290e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
290f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29100 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
29110 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29130 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
29140 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
29150 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29160 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29170 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
29180 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
29190 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
291a0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
291b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
291c0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
291d0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
291e0 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
291f0 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
29200 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
29210 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ile */.    rc = 
29220 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29230 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
29240 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
29250 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29260 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
29270 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
29280 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
29290 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
292a0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
292b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
292c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
292d0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
292e0 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
292f0 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
29300 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
29310 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
29320 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
29330 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
29340 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
29350 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
29360 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
29370 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
29380 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
29390 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
293a0 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
293b0 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
293c0 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
293d0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
293e0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
293f0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
29400 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
29410 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
29420 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
29430 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
29440 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
29450 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
29460 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
29470 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
29480 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
29490 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
294a0 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
294b0 50 61 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a  Page, &pPg, 1);.
294c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
294d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
294e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
294f0 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
29500 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
29510 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
29520 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29530 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29540 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
29550 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
29560 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
29570 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
29580 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
29590 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
295a0 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
295b0 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
295c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
295d0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
295e0 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
295f0 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
29600 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
29610 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
29620 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
29630 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
29640 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
29650 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   1);.    if( rc 
29660 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29680 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
29690 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
296a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
296b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
296c0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
296d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
296e0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
296f0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
29700 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
29710 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
29720 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
29730 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
29740 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
29750 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
29760 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
29770 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
29780 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  runk);.  if( rc=
29790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
297a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
297b0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
297c0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
297d0 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
297e0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
297f0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
29800 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29810 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
29820 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
29830 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
29840 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
29850 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
29860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
29870 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
29880 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65  iteable((*ppPage
29890 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  )->pDbPage) );. 
298a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
298b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
298c0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
298d0 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
298e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
298f0 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
29900 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
29910 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
29920 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
29930 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
29940 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
29950 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
29960 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
29970 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
29980 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
29990 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
299a0 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
299b0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
299c0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
299d0 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
299e0 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
299f0 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
29a00 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
29a10 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
29a20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
29a30 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
29a40 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
29a50 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
29a60 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
29a70 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
29a80 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
29a90 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
29aa0 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
29ab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
29ac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
29ad0 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
29ae0 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
29af0 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
29b00 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
29b10 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
29b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29b30 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
29b40 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
29b50 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b70 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
29b80 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
29b90 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
29ba0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
29bb0 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
29bc0 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
29bd0 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
29be0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c00 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
29c10 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
29c20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
29c30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c50 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
29c60 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
29c90 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
29ca0 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
29cb0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
29cc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
29cd0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
29ce0 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
29cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
29d00 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
29d10 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
29d20 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
29d30 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
29d40 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
29d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
29d60 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
29d80 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
29d90 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
29da0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
29db0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
29dc0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
29dd0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
29de0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29df0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
29e00 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
29e10 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29e20 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
29e30 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29e40 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
29e50 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29e60 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
29e70 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
29e80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
29e90 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
29ea0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
29eb0 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
29ec0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
29ed0 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
29ee0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
29ef0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
29f00 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
29f10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29f20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
29f30 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29f40 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
29f50 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
29f60 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
29f70 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
29f80 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
29f90 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
29fa0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
29fb0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
29fc0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
29fd0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
29fe0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
29ff0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2a000 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2a010 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2a020 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
2a030 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
2a040 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
2a050 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2a060 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
2a070 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
2a080 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2a090 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
2a0a0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2a0b0 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
2a0c0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a0d0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2a0e0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
2a0f0 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
2a100 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
2a110 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
2a120 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
2a130 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
2a140 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
2a150 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
2a160 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
2a170 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
2a180 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2a190 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
2a1a0 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
2a1b0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
2a1c0 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
2a1d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
2a1e0 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
2a1f0 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
2a200 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
2a210 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2a220 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
2a230 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
2a240 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
2a250 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
2a260 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
2a270 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
2a280 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
2a290 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
2a2a0 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
2a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a2c0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2a2d0 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
2a2e0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
2a2f0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2a300 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2a310 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
2a320 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2a330 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2a340 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
2a350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a360 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2a370 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2a380 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
2a390 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2a3a0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2a3b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2a3c0 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
2a3d0 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
2a3e0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
2a3f0 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
2a400 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2a410 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2a420 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2a430 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
2a440 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
2a450 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2a460 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
2a470 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
2a480 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
2a490 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
2a4a0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
2a4b0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
2a4c0 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
2a4d0 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
2a4e0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
2a4f0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2a500 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
2a510 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
2a520 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
2a530 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2a540 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
2a550 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
2a560 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
2a570 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
2a580 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
2a590 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
2a5a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2a5b0 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
2a5c0 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
2a5d0 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
2a5e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
2a5f0 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
2a600 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2a610 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2a620 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
2a630 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
2a640 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
2a650 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
2a660 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
2a670 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
2a680 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2a690 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
2a6a0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
2a6b0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
2a6c0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2a6d0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
2a6e0 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
2a6f0 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
2a700 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2a710 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
2a720 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
2a730 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
2a740 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
2a750 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
2a760 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
2a770 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
2a780 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
2a790 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
2a7a0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
2a7b0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
2a7c0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2a7d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a7e0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2a7f0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2a800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a810 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2a820 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2a830 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
2a840 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2a850 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
2a860 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
2a870 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2a880 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
2a890 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
2a8a0 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
2a8b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a8c0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a8d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2a8e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a8f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
2a900 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2a910 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
2a920 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
2a930 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
2a940 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
2a950 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
2a960 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
2a970 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2a980 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2a990 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
2a9a0 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
2a9b0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
2a9c0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
2a9d0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
2a9e0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
2a9f0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
2aa00 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
2aa10 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2aa20 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
2aa30 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
2aa40 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
2aa50 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
2aa60 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2aa70 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
2aa80 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2aa90 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
2aaa0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
2aab0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
2aac0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
2aad0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
2aae0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2aaf0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
2ab00 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
2ab10 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
2ab20 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2ab30 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2ab40 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
2ab50 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2ab60 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2ab70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2ab80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2ab90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2aba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2abb0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2abc0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2abd0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2abe0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2abf0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2ac00 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2ac10 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2ac20 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2ac30 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2ac40 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2ac50 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2ac60 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2ac70 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2ac80 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2ac90 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2aca0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2acb0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2acc0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2acd0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2ace0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2acf0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2ad00 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2ad10 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2ad20 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2ad30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2ad40 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2ad50 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2ad60 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2ad70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2ad80 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2ad90 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2ada0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2adb0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
2adc0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
2add0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
2ade0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2adf0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
2ae00 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2ae10 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
2ae20 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
2ae30 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
2ae40 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
2ae50 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
2ae60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ae70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2ae80 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2ae90 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
2aea0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2aeb0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2aec0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2aed0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
2aee0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
2aef0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
2af00 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
2af10 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
2af20 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2af30 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
2af40 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d  rflow+3 > pPage-
2af50 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
2af60 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
2af70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2af80 55 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  UPT;  /* Cell ex
2af90 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
2afa0 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
2afb0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
2afc0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2afd0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
2afe0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2aff0 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
2b000 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
2b010 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2b020 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
2b030 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
2b040 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
2b050 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
2b060 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
2b070 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
2b080 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
2b090 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
2b0a0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
2b0b0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
2b0c0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2b0d0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
2b0e0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
2b0f0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2b100 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2b110 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2b120 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2b130 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2b140 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2b150 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2b160 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2b170 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2b180 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2b190 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2b1a0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2b1b0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2b1c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b1d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2b1e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2b1f0 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2b200 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2b210 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2b220 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2b230 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2b240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2b250 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2b260 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2b270 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2b280 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2b290 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2b2a0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2b2b0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2b2c0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2b2d0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2b2e0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2b2f0 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2b300 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2b310 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2b320 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2b330 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2b340 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2b350 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2b360 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2b370 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2b380 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2b390 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2b3a0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2b3b0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2b3c0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2b3d0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2b3e0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2b3f0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2b400 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2b410 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2b420 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2b430 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2b440 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2b450 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2b460 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2b470 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2b480 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2b490 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2b4a0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2b4b0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2b4c0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2b4d0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2b4e0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2b4f0 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2b500 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2b510 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2b520 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2b530 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2b540 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2b550 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2b560 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2b570 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2b580 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2b590 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2b5a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2b5b0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2b5c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2b5d0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2b5e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b5f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b600 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2b610 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2b620 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b630 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2b640 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2b650 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2b660 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2b670 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2b680 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2b690 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2b6a0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2b6b0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2b6c0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2b6d0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2b6e0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2b6f0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2b700 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2b710 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2b720 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2b730 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2b740 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2b750 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b760 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2b770 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2b780 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2b790 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2b7a0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2b7b0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2b7c0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2b7d0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2b7e0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2b7f0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2b800 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2b810 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2b820 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2b830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b840 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2b850 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2b860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b870 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2b880 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2b890 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2b8a0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2b8b0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2b8c0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2b8d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2b8e0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2b8f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2b900 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2b910 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2b920 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2b930 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b950 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2b960 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2b970 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2b980 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b9a0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2b9b0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2b9c0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2b9d0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2b9e0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2b9f0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2ba00 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2ba10 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2ba20 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2ba30 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2ba40 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2ba50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2ba60 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2ba70 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2ba80 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2ba90 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2baa0 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2bab0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2bac0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2bad0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2bae0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2baf0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2bb00 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2bb10 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2bb20 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2bb30 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2bb40 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2bb50 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2bb60 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2bb70 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2bb80 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2bb90 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2bba0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2bbb0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2bbc0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2bbd0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2bbe0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2bbf0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2bc00 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2bc10 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2bc20 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2bc30 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2bc40 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2bc50 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2bc60 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2bc70 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2bc80 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2bc90 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
2bca0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
2bcb0 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
2bcc0 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
2bcd0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
2bce0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
2bcf0 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65  )&nKey);.  btree
2bd00 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2bd10 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2bd20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2bd30 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
2bd40 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2bd50 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
2bd60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2bd70 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
2bd80 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
2bd90 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
2bda0 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
2bdb0 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
2bdc0 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
2bdd0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2bde0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2bdf0 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2be00 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2be10 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2be20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2be30 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2be40 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2be50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2be60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2be70 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2be80 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
2be90 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
2bea0 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
2beb0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
2bec0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
2bed0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
2bee0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
2bef0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
2bf00 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
2bf10 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
2bf20 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
2bf30 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2bf40 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2bf50 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2bf60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2bf70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2bf80 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2bf90 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2bfa0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2bfb0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2bfc0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2bfd0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2bfe0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2bff0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2c000 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2c010 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2c020 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2c030 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2c040 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2c050 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2c060 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2c070 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2c080 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2c090 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2c0a0 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2c0b0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2c0c0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2c0d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2c0e0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2c0f0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2c100 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2c110 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2c120 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2c130 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2c140 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2c150 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2c160 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2c170 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2c180 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2c190 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2c1a0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2c1b0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2c1c0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2c1d0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2c1e0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2c1f0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2c200 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2c210 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2c220 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2c230 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2c240 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2c250 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2c260 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2c270 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2c280 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2c290 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2c2a0 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
2c2b0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2c2c0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2c2d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2c2e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2c2f0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2c300 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2c310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c320 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2c330 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2c340 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2c350 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2c360 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2c370 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2c380 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2c390 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2c3a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2c3b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c3c0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2c3d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2c3e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2c3f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2c400 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2c410 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c420 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2c430 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2c440 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2c450 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2c460 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2c470 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2c480 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2c490 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2c4a0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2c4b0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2c4c0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2c4d0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2c4e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2c4f0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2c500 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2c510 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2c520 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2c530 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2c540 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2c550 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2c560 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2c570 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2c580 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2c590 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2c5a0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2c5b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2c5c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2c5d0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c5e0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2c5f0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2c600 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2c610 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2c620 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2c630 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2c640 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2c650 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2c660 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2c670 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2c680 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2c690 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2c6a0 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2c6b0 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2c6c0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2c6d0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2c6e0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2c6f0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2c700 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2c710 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2c720 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2c730 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2c740 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2c750 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2c760 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2c770 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2c780 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2c790 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2c7a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
2c7b0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2c7c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c7d0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2c7e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2c7f0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
2c800 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
2c810 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2c820 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2c830 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
2c840 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2c850 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
2c860 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
2c870 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
2c880 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
2c890 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2c8a0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2c8b0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2c8c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c8d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2c8e0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
2c8f0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
2c900 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
2c910 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
2c920 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2c930 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
2c940 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2c950 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
2c960 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
2c970 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2c980 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
2c990 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
2c9a0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
2c9b0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
2c9c0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
2c9d0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
2c9e0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2c9f0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
2ca00 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
2ca10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2ca20 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
2ca30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ca40 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2ca50 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
2ca60 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
2ca70 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
2ca80 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
2ca90 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2caa0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
2cab0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
2cac0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
2cad0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
2cae0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
2caf0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
2cb00 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2cb10 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
2cb20 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
2cb30 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
2cb40 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
2cb50 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
2cb60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2cb70 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
2cb80 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
2cb90 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2cba0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
2cbb0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
2cbc0 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
2cbd0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2cbe0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2cbf0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2cc00 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2cc10 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2cc20 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2cc30 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2cc40 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2cc50 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2cc60 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2cc70 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45  endPtr;     /* E
2cc80 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  nd of loop */.  
2cc90 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2cca0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2ccb0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
2ccc0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2ccd0 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
2cce0 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
2ccf0 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
2cd00 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
2cd10 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2cd20 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2cd30 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2cd40 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2cd50 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
2cd60 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
2cd70 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2cd80 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2cd90 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2cda0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2cdb0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2cdc0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2cdd0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2cde0 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
2cdf0 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
2ce00 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
2ce10 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
2ce20 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2ce30 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
2ce40 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
2ce50 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
2ce60 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
2ce70 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
2ce80 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2ce90 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
2cea0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2ceb0 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
2cec0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2ced0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
2cee0 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
2cef0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
2cf00 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
2cf10 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
2cf20 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
2cf30 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
2cf40 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2cf50 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d  ;.  }.  endPtr =
2cf60 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
2cf70 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x[2*pPage->nCell
2cf80 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28   - 2];.  assert(
2cf90 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
2cfa0 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29  INT(ptr)&1)==0 )
2cfb0 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77  ;  /* ptr is alw
2cfc0 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e  ays 2-byte align
2cfd0 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ed */.  while( p
2cfe0 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20  tr<endPtr ){.   
2cff0 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28   *(u16*)ptr = *(
2d000 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20  u16*)&ptr[2];.  
2d010 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a    ptr += 2;.  }.
2d020 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
2d030 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2d040 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
2d050 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
2d060 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d  e->nFree += 2;.}
2d070 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2d080 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
2d090 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
2d0a0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
2d0b0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
2d0c0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
2d0d0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2d0e0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
2d0f0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
2d100 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
2d110 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
2d120 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
2d130 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
2d140 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2d150 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
2d160 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
2d170 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
2d180 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
2d190 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
2d1a0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
2d1b0 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  pOvfl[] and make
2d1c0 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
2d1d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
2d1e0 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
2d1f0 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
2d200 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
2d210 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
2d220 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
2d230 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
2d240 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
2d250 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
2d260 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
2d270 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
2d280 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
2d290 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
2d2a0 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
2d2b0 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
2d2c0 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
2d2d0 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
2d2e0 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
2d2f0 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
2d300 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2d310 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
2d320 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2d330 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
2d340 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
2d350 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
2d360 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
2d370 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
2d380 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
2d390 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65  ic void insertCe
2d3a0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
2d3b0 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
2d3c0 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
2d3d0 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
2d3e0 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
2d3f0 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
2d400 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
2d410 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
2d420 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
2d430 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2d440 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
2d450 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
2d460 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
2d470 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
2d480 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
2d490 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
2d4a0 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
2d4b0 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
2d4c0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
2d4d0 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a   iChild,      /*
2d4e0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
2d4f0 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
2d500 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
2d510 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  lue */.  int *pR
2d520 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  C          /* Re
2d530 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74  ad and write ret
2d540 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65  urn code from he
2d550 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
2d560 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  dx = 0;      /* 
2d570 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
2d580 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
2d590 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2d5a0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
2d5b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2d5c0 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
2d5d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2d5e0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
2d5f0 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
2d600 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2d610 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
2d620 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
2d630 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
2d640 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
2d650 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
2d660 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
2d670 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
2d680 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2d690 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
2d6a0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2d6b0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
2d6c0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
2d6d0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
2d6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2d6f0 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
2d700 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
2d710 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2d720 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20   *endPtr;       
2d730 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
2d740 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b  op */..  int nSk
2d750 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34  ip = (iChild ? 4
2d760 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70   : 0);..  if( *p
2d770 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
2d780 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
2d790 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
2d7a0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d7c0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
2d7d0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
2d7e0 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  && MX_CELL(pPage
2d7f0 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
2d800 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d810 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
2d820 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
2d830 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
2d840 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61  t( ArraySize(pPa
2d850 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72  ge->apOvfl)==Arr
2d860 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69  aySize(pPage->ai
2d870 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
2d880 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d890 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2d8a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
2d8b0 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
2d8c0 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
2d8d0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
2d8e0 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
2d8f0 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
2d900 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
2d910 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
2d920 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
2d930 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
2d940 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
2d950 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
2d960 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
2d970 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
2d980 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
2d990 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
2d9a0 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
2d9b0 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
2d9c0 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
2d9d0 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
2d9e0 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
2d9f0 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
2da00 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
2da10 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
2da20 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2da30 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
2da40 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
2da50 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
2da60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
2da70 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
2da80 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
2da90 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
2daa0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
2dab0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
2dac0 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
2dad0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
2dae0 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
2daf0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2db00 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
2db10 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
2db20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2db30 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
2db40 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
2db50 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f  (pPage->apOvfl)/
2db60 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
2db70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
2db80 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a   pPage->apOvfl[j
2db90 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  ] = pCell;.    p
2dba0 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20  Page->aiOvfl[j] 
2dbb0 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73  = (u16)i;.  }els
2dbc0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
2dbd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dbe0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2dbf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2dc00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dc10 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2dc20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2dc30 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2dc40 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2dc50 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2dc60 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
2dc70 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2dc80 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
2dc90 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
2dca0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
2dcb0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
2dcc0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2dcd0 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
2dce0 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
2dcf0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
2dd00 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
2dd10 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
2dd20 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
2dd30 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
2dd40 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
2dd50 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
2dd60 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
2dd70 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20  two properties. 
2dd80 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
2dd90 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  rns success */. 
2dda0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
2ddb0 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61  = end+2 );.    a
2ddc0 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
2ddd0 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
2dde0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2ddf0 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
2de00 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
2de10 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
2de20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
2de30 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
2de40 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
2de50 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2de60 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2de70 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
2de80 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
2de90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20  ;.    }.    ptr 
2dea0 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20  = &data[end];.  
2deb0 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61    endPtr = &data
2dec0 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72  [ins];.    asser
2ded0 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54  t( (SQLITE_PTR_T
2dee0 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30  O_INT(ptr)&1)==0
2def0 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61   );  /* ptr is a
2df00 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69  lways 2-byte ali
2df10 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c  gned */.    whil
2df20 65 28 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b  e( ptr>endPtr ){
2df30 0a 20 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74  .      *(u16*)pt
2df40 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b  r = *(u16*)&ptr[
2df50 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d  -2];.      ptr -
2df60 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 2;.    }.    p
2df70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
2df80 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
2df90 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
2dfa0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
2dfb0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
2dfc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2dfd0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2dfe0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
2dff0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2e000 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
2e010 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
2e020 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2e030 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2e040 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
2e050 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
2e060 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
2e070 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
2e080 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
2e090 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
2e0a0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
2e0b0 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
2e0c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
2e0d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
2e0e0 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
2e0f0 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
2e100 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
2e110 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
2e120 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
2e130 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
2e140 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
2e150 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
2e160 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
2e170 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2e180 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
2e190 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
2e1a0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
2e1b0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
2e1c0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
2e1d0 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
2e1e0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
2e1f0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
2e200 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
2e210 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
2e220 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
2e230 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
2e240 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2e250 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2e260 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  unter */.  u8 *p
2e270 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20  Cellptr;     /* 
2e280 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2e290 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
2e2a0 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
2e2b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2e2c0 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
2e2d0 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
2e2e0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2e2f0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2e300 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2e310 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a  data for pPage *
2e320 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  /.  const int hd
2e330 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2e340 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
2e350 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
2e360 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a  der on pPage */.
2e370 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61    const int nUsa
2e380 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ble = pPage->pBt
2e390 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  ->usableSize; /*
2e3a0 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
2e3b0 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
2e3c0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2e3d0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
2e3e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e3f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2e400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2e410 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
2e420 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d  && nCell<=(int)M
2e430 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2e440 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t).            &
2e450 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70  & (int)MX_CELL(p
2e460 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
2e470 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
2e480 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2e490 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2e4a0 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  Page) );..  /* C
2e4b0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61  heck that the pa
2e4c0 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ge has just been
2e4d0 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50   zeroed by zeroP
2e4e0 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72  age() */.  asser
2e4f0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
2e500 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e510 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
2e520 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
2e530 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
2e540 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e  llptr = &pPage->
2e550 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32  aCellIdx[nCell*2
2e560 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
2e570 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
2e580 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
2e590 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  i--){.    u16 sz
2e5a0 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20   = aSize[i];.   
2e5b0 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a   pCellptr -= 2;.
2e5c0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20      cellbody -= 
2e5d0 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  sz;.    put2byte
2e5e0 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62  (pCellptr, cellb
2e5f0 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ody);.    memcpy
2e600 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
2e610 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29  , apCell[i], sz)
2e620 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
2e630 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
2e640 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
2e650 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
2e660 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2e670 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43  ge->nFree -= (nC
2e680 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20  ell*2 + nUsable 
2e690 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  - cellbody);.  p
2e6a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75  Page->nCell = (u
2e6b0 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  16)nCell;.}../*.
2e6c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2e6d0 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
2e6e0 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
2e6f0 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
2e700 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
2e710 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
2e720 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
2e730 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
2e740 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2e750 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
2e760 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
2e770 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2e780 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
2e790 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
2e7a0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2e7b0 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
2e7c0 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
2e7d0 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
2e7e0 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
2e7f0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2e800 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
2e810 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
2e820 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
2e830 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
2e840 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
2e850 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
2e860 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
2e870 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
2e880 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
2e890 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
2e8a0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
2e8b0 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
2e8c0 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
2e8d0 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
2e8e0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
2e8f0 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
2e900 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
2e910 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
2e920 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
2e930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e940 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2e950 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2e960 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
2e970 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
2e980 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
2e990 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
2e9a0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
2e9b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2e9c0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
2e9d0 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
2e9e0 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
2e9f0 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
2ea00 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
2ea10 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
2ea20 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
2ea30 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
2ea40 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
2ea50 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
2ea60 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
2ea70 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
2ea80 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
2ea90 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
2eaa0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
2eab0 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
2eac0 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
2ead0 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
2eae0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
2eaf0 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
2eb00 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2eb10 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2eb20 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
2eb30 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
2eb40 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
2eb50 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
2eb60 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
2eb70 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
2eb80 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
2eb90 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
2eba0 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
2ebb0 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
2ebc0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
2ebd0 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
2ebe0 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
2ebf0 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
2ec00 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
2ec10 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
2ec20 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
2ec30 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2ec40 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
2ec50 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
2ec60 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
2ec70 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
2ec80 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
2ec90 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
2eca0 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
2ecb0 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
2ecc0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
2ecd0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
2ece0 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
2ecf0 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
2ed00 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
2ed10 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
2ed20 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
2ed30 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2ed40 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
2ed50 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
2ed60 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
2ed70 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2ed80 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
2ed90 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2eda0 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
2edb0 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
2edc0 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
2edd0 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
2ede0 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
2edf0 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
2ee00 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
2ee10 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2ee20 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
2ee30 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
2ee40 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
2ee50 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
2ee60 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
2ee70 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
2ee80 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
2ee90 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
2eea0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2eeb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
2eec0 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
2eed0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ef00 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
2ef10 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef30 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2ef40 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
2ef50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ef60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2ef70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2ef80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2ef90 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2efa0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2efb0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2efc0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2efd0 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  low==1 );..  /* 
2efe0 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  This error condi
2eff0 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67  tion is now caug
2f000 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
2f010 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  hing this functi
2f020 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  on */.  if( pPag
2f030 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65  e->nCell<=0 ) re
2f040 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2f050 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
2f060 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2f070 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77  age. This page w
2f080 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2f090 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
2f0a0 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b  .  ** pPage. Mak
2f0b0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2f0c0 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74  e writable, so t
2f0d0 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  hat the new divi
2f0e0 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61  der cell.  ** ma
2f0f0 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49  y be inserted. I
2f100 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65  f both these ope
2f110 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63  rations are succ
2f120 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e  essful, proceed.
2f130 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
2f140 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2f150 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2f160 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69  New, 0, 0);..  i
2f170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f180 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75   ){..    u8 *pOu
2f190 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a  t = &pSpace[4];.
2f1a0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
2f1b0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d  pPage->apOvfl[0]
2f1c0 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
2f1d0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2f1e0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2f1f0 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
2f200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f210 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f220 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2f230 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f240 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
2f250 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
2f260 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2f270 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
2f280 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
2f290 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2f2a0 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
2f2b0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
2f2c0 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
2f2d0 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a  szCell);..    /*
2f2e0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2f2f0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2f300 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2f310 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
2f320 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
2f330 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
2f340 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
2f350 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
2f360 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
2f370 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
2f380 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68  ow page. If eith
2f390 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20  er of these.    
2f3a0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61  ** operations fa
2f3b0 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ils, the return 
2f3c0 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74  code is set, but
2f3d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
2f3e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65    ** of the pare
2f3f0 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c  nt page are stil
2f400 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  l manipulated by
2f410 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e   thh code below.
2f420 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20  .    ** That is 
2f430 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Ok, at this poin
2f440 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2f450 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2f460 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  to.    ** be mar
2f470 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65  ked as dirty. Re
2f480 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
2f490 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65   code will cause
2f4a0 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
2f4b0 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20  ck, undoing any 
2f4c0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
2f4d0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2f4e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2f4f0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2f500 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
2f510 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
2f520 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
2f530 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
2f540 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c  .      if( szCel
2f550 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  l>pNew->minLocal
2f560 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d   ){.        ptrm
2f570 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65  apPutOvflPtr(pNe
2f580 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  w, pCell, &rc);.
2f590 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f5a0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2f5b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
2f5c0 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
2f5d0 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
2f5e0 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
2f5f0 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
2f600 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
2f610 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f620 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
2f630 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
2f640 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
2f650 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
2f660 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
2f670 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
2f680 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
2f690 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
2f6a0 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
2f6b0 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
2f6c0 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
2f6d0 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
2f6e0 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
2f6f0 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
2f700 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
2f710 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
2f720 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
2f730 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
2f740 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2f750 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
2f760 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
2f770 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
2f780 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
2f790 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2f7a0 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
2f7b0 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
2f7c0 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
2f7d0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2f7e0 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
2f7f0 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
2f800 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
2f810 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
2f820 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
2f830 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
2f840 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
2f850 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2f860 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
2f870 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
2f880 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2f890 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
2f8a0 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
2f8b0 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2f8c0 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2f8d0 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
2f8e0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2f8f0 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2f900 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2f910 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
2f920 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
2f930 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2f940 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
2f950 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
2f960 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2f970 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
2f980 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2f990 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  nt, pParent->nCe
2f9a0 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74  ll, pSpace, (int
2f9b0 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a  )(pOut-pSpace),.
2f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2f9d0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26  , pPage->pgno, &
2f9e0 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  rc);..    /* Set
2f9f0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
2fa00 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72   pointer of pPar
2fa10 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ent to point to 
2fa20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
2fa30 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2fa40 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2fa50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2fa60 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20  +8], pgnoNew);. 
2fa70 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65   .    /* Release
2fa80 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
2fa90 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
2faa0 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
2fab0 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
2fac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
2fad0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2fae0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2faf0 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a   */..#if 0./*.**
2fb00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
2fb10 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
2fb20 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  te anything to t
2fb30 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  he operation of 
2fb40 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73  SQLite..** it is
2fb50 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76   sometimes activ
2fb60 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79  ated temporarily
2fb70 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67   while debugging
2fb80 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c   code responsibl
2fb90 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e  e .** for settin
2fba0 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  g pointer-map en
2fbb0 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
2fbc0 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b   int ptrmapCheck
2fbd0 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a  Pages(MemPage **
2fbe0 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67  apPage, int nPag
2fbf0 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  e){.  int i, j;.
2fc00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61    for(i=0; i<nPa
2fc10 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67  ge; i++){.    Pg
2fc20 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a  no n;.    u8 e;.
2fc30 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2fc40 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a  ge = apPage[i];.
2fc50 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
2fc60 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2fc70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fc80 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2fc90 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61    for(j=0; j<pPa
2fca0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b  ge->nCell; j++){
2fcb0 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  .      CellInfo 
2fcc0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a  info;.      u8 *
2fcd0 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a  z;.     .      z
2fce0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2fcf0 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72  e, j);.      btr
2fd00 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2fd10 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b  Page, z, &info);
2fd20 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e  .      if( info.
2fd30 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
2fd40 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
2fd50 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66   get4byte(&z[inf
2fd60 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2fd70 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2fd80 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20  (pBt, ovfl, &e, 
2fd90 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
2fda0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2fdb0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2fdc0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20  _OVERFLOW1 );.  
2fdd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fde0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2fdf0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69          Pgno chi
2fe00 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29  ld = get4byte(z)
2fe10 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
2fe20 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
2fe30 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2fe40 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2fe50 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2fe60 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
2fe70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2fe80 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2fe90 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
2fea0 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2feb0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2fec0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2fed0 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  ]);.      ptrmap
2fee0 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
2fef0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61  &e, &n);.      a
2ff00 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2ff10 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2ff20 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
2ff30 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2ff40 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2ff50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ff60 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  is used to copy 
2ff70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2ff80 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
2ff90 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61  stored .** on pa
2ffa0 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
2ffb0 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46   pTo. If page pF
2ffc0 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65  rom was not a le
2ffd0 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a  af page, then.**
2ffe0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2fff0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
30000 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65  h child page are
30010 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
30020 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70   the.** parent p
30030 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  age stored in th
30040 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73  e pointer map is
30050 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46   page pTo. If pF
30060 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a  rom contained.**
30070 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20   any cells with 
30080 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
30090 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65  inters, then the
300a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
300b0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
300c0 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75  tries are also u
300d0 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
300e0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
300f0 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a  s page pTo..**.*
30100 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75  * If pFrom is cu
30110 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67  rrently carrying
30120 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65   any overflow ce
30130 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20  lls (entries in 
30140 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  the.** MemPage.a
30150 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20  pOvfl[] array), 
30160 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70  they are not cop
30170 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a  ied to pTo. .**.
30180 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
30190 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73  ing, page pTo is
301a0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75   reinitialized u
301b0 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61  sing btreeInitPa
301c0 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ge()..**.** The 
301d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74  performance of t
301e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
301f0 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74  not critical. It
30200 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
30210 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65   .** the balance
30220 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64  _shallower() and
30230 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
30240 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65  ) procedures, ne
30250 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63  ither of.** whic
30260 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74  h are called oft
30270 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20  en under normal 
30280 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a  circumstances..*
30290 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
302a0 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65  pyNodeContent(Me
302b0 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65  mPage *pFrom, Me
302c0 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20  mPage *pTo, int 
302d0 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
302e0 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
302f0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
30300 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72   const pBt = pFr
30310 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20  om->pBt;.    u8 
30320 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20  * const aFrom = 
30330 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20  pFrom->aData;.  
30340 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f    u8 * const aTo
30350 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20   = pTo->aData;. 
30360 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72     int const iFr
30370 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68  omHdr = pFrom->h
30380 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e  drOffset;.    in
30390 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d  t const iToHdr =
303a0 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29   ((pTo->pgno==1)
303b0 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20   ? 100 : 0);.   
303c0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
303d0 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20   iData;.  .  .  
303e0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
303f0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61  >isInit );.    a
30400 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46  ssert( pFrom->nF
30410 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20  ree>=iToHdr );. 
30420 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
30430 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
30440 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29  Hdr+5]) <= (int)
30450 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
30460 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70  );.  .    /* Cop
30470 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  y the b-tree nod
30480 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70  e content from p
30490 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
304a0 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44  e pTo. */.    iD
304b0 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26  ata = get2byte(&
304c0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
304d0 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
304e0 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72  aTo[iData], &aFr
304f0 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e  om[iData], pBt->
30500 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61  usableSize-iData
30510 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
30520 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72  To[iToHdr], &aFr
30530 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46  om[iFromHdr], pF
30540 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  rom->cellOffset 
30550 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c  + 2*pFrom->nCell
30560 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69  );.  .    /* Rei
30570 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70  nitialize page p
30580 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  To so that the c
30590 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d  ontents of the M
305a0 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
305b0 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68  .    ** match th
305c0 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20  e new data. The 
305d0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
305e0 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c  f pTo can actual
305f0 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20  ly fail under.  
30600 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63    ** fairly obsc
30610 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65  ure circumstance
30620 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  s, even though i
30630 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69  t is a copy of i
30640 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20  nitialized .    
30650 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20  ** page pFrom.. 
30660 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69     */.    pTo->i
30670 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72  sInit = 0;.    r
30680 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
30690 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20  e(pTo);.    if( 
306a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
306b0 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
306c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
306d0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
306e0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
306f0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
30700 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
30710 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
30720 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e  es.    ** for an
30730 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72  y b-tree or over
30740 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
30750 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  pTo now contains
30760 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f   the pointers to
30770 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30780 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
30790 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65  .      *pRC = se
307a0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54  tChildPtrmaps(pT
307b0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  o);.    }.  }.}.
307c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
307d0 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65  ine redistribute
307e0 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  s cells on the i
307f0 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69  ParentIdx'th chi
30800 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a  ld of pParent.**
30810 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65   (hereafter "the
30820 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74   page") and up t
30830 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20  o 2 siblings so 
30840 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68  that all pages h
30850 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a  ave about the.**
30860 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20   same amount of 
30870 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61  free space. Usua
30880 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62  lly a single sib
30890 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73  ling on either s
308a0 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  ide of the.** pa
308b0 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74  ge are used in t
308c0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  he balancing, th
308d0 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e  ough both siblin
308e0 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72  gs might come fr
308f0 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69  om one.** side i
30900 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68  f the page is th
30910 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20  e first or last 
30920 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
30930 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65  ent. If the page
30940 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74   .** has fewer t
30950 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28  han 2 siblings (
30960 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
30970 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
30980 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  if the page.** i
30990 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72  s a root page or
309a0 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f   a child of a ro
309b0 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c  ot page) then al
309c0 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c  l available sibl
309d0 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70  ings.** particip
309e0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
309f0 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
30a00 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
30a10 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d  gs of the page m
30a20 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
30a30 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  d or decreased b
30a40 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f  y .** one or two
30a50 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
30a60 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
30a70 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
30a80 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a  over full. .**.*
30a90 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e  * Note that when
30aa0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
30ab0 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66   called, some of
30ac0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68   the cells on th
30ad0 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20  e page.** might 
30ae0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
30af0 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67  stored in MemPag
30b00 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20  e.aData[]. This 
30b10 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
30b20 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
30b30 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74  rfull. This rout
30b40 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
30b50 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63   all cells alloc
30b60 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70  ated.** to the p
30b70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
30b80 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65  ings fit into Me
30b90 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65  mPage.aData[] be
30ba0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
30bb0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75  **.** In the cou
30bc0 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67  rse of balancing
30bd0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
30be0 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c  s siblings, cell
30bf0 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65  s may be.** inse
30c00 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d  rted into or rem
30c10 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
30c20 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65  rent page (pPare
30c30 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a  nt). Doing so.**
30c40 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70   may cause the p
30c50 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65  arent page to be
30c60 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
30c70 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74   underfull. If t
30c80 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20  his.** happens, 
30c90 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  it is the respon
30ca0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
30cb0 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65  caller to invoke
30cc0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
30cd0 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  balancing routin
30ce0 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72  e to fix this pr
30cf0 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62  oblem (see the b
30d00 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65  alance() routine
30d10 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ). .**.** If thi
30d20 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20  s routine fails 
30d30 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
30d40 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74  it might leave t
30d50 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
30d60 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74  n a corrupted st
30d70 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20  ate. So if this 
30d80 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
30d90 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
30da0 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
30db0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  back..**.** The 
30dc0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
30dd0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
30de0 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20   aOvflSpace, is 
30df0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a  a pointer to a.*
30e00 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f  * buffer big eno
30e10 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20  ugh to hold one 
30e20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69  page. If while i
30e30 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69  nserting cells i
30e40 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a  nto the parent.*
30e50 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  * page (pParent)
30e60 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
30e70 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
30e80 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69  l, this buffer i
30e90 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  s.** used to sto
30ea0 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20  re the parent's 
30eb0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
30ec0 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  Because this fun
30ed0 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a  ction inserts.**
30ee0 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f   a maximum of fo
30ef0 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ur divider cells
30f00 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
30f10 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d   page, and the m
30f20 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f  aximum.** size o
30f30 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20  f a cell stored 
30f40 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e  within an intern
30f50 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  al node is alway
30f60 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a  s less than 1/4.
30f70 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  ** of the page-s
30f80 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70  ize, the aOvflSp
30f90 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20  ace[] buffer is 
30fa0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
30fb0 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
30fc0 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f   for all overflo
30fd0 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  w cells..**.** I
30fe0 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20  f aOvflSpace is 
30ff0 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f  set to a null po
31000 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
31010 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
31020 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
31030 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
31040 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
31050 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
31060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31070 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
31080 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
31090 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
310a0 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
310b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
310c0 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
310d0 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
310e0 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
310f0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
31100 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
31110 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
31120 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
31130 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
31140 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
31150 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31160 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
31170 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  oot-page */.){. 
31180 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
311a0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
311b0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
311c0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
311d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
311e0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
311f0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
31200 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
31210 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
31220 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
31230 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
31240 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
31250 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31260 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
31270 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
31280 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
31290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
312a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
312b0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
312c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
312d0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
312e0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
312f0 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
31300 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
31310 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
31320 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
31330 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
31340 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
31350 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
31360 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
31370 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c   code */.  u16 l
31380 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
31390 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
313a0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
313b0 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
313c0 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
313d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
313e0 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
313f0 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
31400 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
31410 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
31420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31430 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
31440 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
31450 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
31460 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
31470 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
31480 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
31490 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
314a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
314b0 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
314c0 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
314d0 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
314e0 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
314f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31500 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
31510 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
31520 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
31530 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
31540 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
31550 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
31560 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
31570 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
31580 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
31590 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
315a0 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
315b0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
315c0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
315d0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
315e0 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
315f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
31600 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
31610 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
31620 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
31630 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
31640 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
31650 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
31660 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
31670 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
31680 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
31690 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
316a0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
316b0 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
316c0 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
316d0 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
316e0 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
316f0 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
31700 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
31710 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
31720 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
31730 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
31740 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
31750 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
31760 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
31770 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
31780 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
31790 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
317a0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
317b0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
317c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
317d0 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
317e0 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
317f0 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
31820 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
31830 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
31840 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
31850 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
31860 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
31870 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
31880 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318a0 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
318b0 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
318c0 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
318d0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
318e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
318f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
31900 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
31910 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
31920 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
31930 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
31940 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
31950 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
31960 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
31970 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
31980 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
31990 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
319a0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
319b0 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
319c0 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
319d0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
319e0 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
319f0 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
31a00 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
31a10 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
31a20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
31a30 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
31a40 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
31a50 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
31a60 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
31a70 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
31a80 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
31a90 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
31aa0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
31ab0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
31ac0 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
31ad0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
31ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
31af0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
31b00 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69  0 || pParent->ai
31b10 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74  Ovfl[0]==iParent
31b20 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61  Idx );..  if( !a
31b30 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20  OvflSpace ){.   
31b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
31b50 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
31b60 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67  Find the sibling
31b70 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63   pages to balanc
31b80 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74  e. Also locate t
31b90 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
31ba0 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64  ent .  ** that d
31bb0 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e  ivide the siblin
31bc0 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69  gs. An attempt i
31bd0 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
31be0 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20  N siblings on . 
31bf0 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20   ** either side 
31c00 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73  of pPage. More s
31c10 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
31c20 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
31c30 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20   however, .  ** 
31c40 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77  if there are few
31c50 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
31c60 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
31c70 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e   side. If pParen
31c80 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
31c90 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
31ca0 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
31cb0 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
31cc0 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20   taken.  .  **. 
31cd0 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
31ce0 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76  so drops the div
31cf0 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
31d00 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
31d10 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20   This.  ** way, 
31d20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
31d30 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
31d40 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64  es not have to d
31d50 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a  eal with any.  *
31d60 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  * overflow cells
31d70 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
31d80 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e  age, since if an
31d90 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77  y existed they w
31da0 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c  ill.  ** have al
31db0 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76  ready been remov
31dc0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70  ed..  */.  i = p
31dd0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31de0 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  w + pParent->nCe
31df0 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b  ll;.  if( i<2 ){
31e00 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
31e10 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a      nOld = i+1;.
31e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c    }else{.    nOl
31e30 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69  d = 3;.    if( i
31e40 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20  ParentIdx==0 ){ 
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e60 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30  .      nxDiv = 0
31e70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
31e80 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b  iParentIdx==i ){
31e90 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69  .      nxDiv = i
31ea0 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -2;.    }else{. 
31eb0 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61       nxDiv = iPa
31ec0 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d  rentIdx-1;.    }
31ed0 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a  .    i = 2;.  }.
31ee0 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70    if( (i+nxDiv-p
31ef0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31f00 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  w)==pParent->nCe
31f10 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74  ll ){.    pRight
31f20 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61   = &pParent->aDa
31f30 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
31f40 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73  ffset+8];.  }els
31f50 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  e{.    pRight = 
31f60 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
31f70 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
31f80 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  t->nOverflow);. 
31f90 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34   }.  pgno = get4
31fa0 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20  byte(pRight);.  
31fb0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
31fc0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
31fd0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  age(pBt, pgno, &
31fe0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
31ff0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d  f( rc ){.      m
32000 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20  emset(apOld, 0, 
32010 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d  (i+1)*sizeof(Mem
32020 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67  Page*));.      g
32030 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
32040 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  nup;.    }.    n
32050 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
32060 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
32070 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
32080 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29  w;.    if( (i--)
32090 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
320a0 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70    if( i+nxDiv==p
320b0 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30  Parent->aiOvfl[0
320c0 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ] && pParent->nO
320d0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
320e0 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72   apDiv[i] = pPar
320f0 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  ent->apOvfl[0];.
32100 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
32110 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
32120 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
32130 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
32140 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
32150 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
32160 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
32170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32180 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
32190 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
321a0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
321b0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20  Overflow);.     
321c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
321d0 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
321e0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
321f0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
32200 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20  , apDiv[i]);..  
32210 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
32220 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61  cell from the pa
32230 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76  rent page. apDiv
32240 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  [i] still points
32250 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
32260 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65   cell within the
32270 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68   parent, even th
32280 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e  ough it has been
32290 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20   dropped..      
322a0 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20  ** This is safe 
322b0 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67  because dropping
322c0 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65   a cell only ove
322d0 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73  rwrites the firs
322e0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
322f0 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64  bytes of it, and
32300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
32310 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65  oes not need the
32320 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
32330 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68  four bytes of th
32340 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  e divider cell. 
32350 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  So the pointer i
32360 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20  s safe to use.  
32370 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e      ** later on.
32380 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20    .      **.    
32390 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20    ** But not if 
323a0 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65  we are in secure
323b0 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e  -delete mode. In
323c0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
323d0 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ode,.      ** th
323e0 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75  e dropCell() rou
323f0 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72  tine will overwr
32400 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63  ite the entire c
32410 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e  ell with zeroes.
32420 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
32430 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72  s case, temporar
32440 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c  ily copy the cel
32450 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c  l into the aOvfl
32460 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a  Space[].      **
32470 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c   buffer. It will
32480 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61   be copied out a
32490 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20  gain as soon as 
324a0 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66  the aSpace[] buf
324b0 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  fer.      ** is 
324c0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
324d0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74       if( pBt->bt
324e0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
324f0 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
32500 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
32510 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
32520 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
32530 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51  T(apDiv[i]) - SQ
32540 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
32550 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b  pParent->aData);
32560 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f  .        if( (iO
32570 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e  ff+szNew[i])>(in
32580 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
32590 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
325a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
325b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
325c0 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
325d0 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
325e0 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
325f0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
32600 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
32610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32620 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f        memcpy(&aO
32630 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20  vflSpace[iOff], 
32640 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b  apDiv[i], szNew[
32650 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  i]);.          a
32660 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c  pDiv[i] = &aOvfl
32670 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70  Space[apDiv[i]-p
32680 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a  Parent->aData];.
32690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
326a0 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  }.      dropCell
326b0 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
326c0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
326d0 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20  flow, szNew[i], 
326e0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
326f0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
32700 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
32710 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
32720 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
32730 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
32740 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
32750 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
32760 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
32770 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
32780 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
32790 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  ures.  */.  k = 
327a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
327b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
327c0 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72  mPage));.  szScr
327d0 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
327e0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
327f0 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
32800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
32810 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
32820 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
32830 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
32840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
32850 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  ell */.     + pB
32860 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
32870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
32890 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b  ace1 */.     + k
328a0 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  *nOld;          
328b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
328d0 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70  ge copies (apCop
328e0 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  y) */.  apCell =
328f0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
32900 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
32910 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
32920 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
32930 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
32940 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
32950 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
32960 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
32970 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
32980 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75  ;.  aSpace1 = (u
32990 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
329a0 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
329b0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
329c0 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
329d0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  ;..  /*.  ** Loa
329e0 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
329f0 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
32a00 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
32a10 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
32a20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
32a30 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
32a40 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
32a50 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
32a60 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
32a70 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
32a80 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64  om aSpace1[] and
32a90 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20   remove the the 
32aa0 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20  divider Cells.  
32ab0 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e  ** from pParent.
32ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
32ad0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f  e siblings are o
32ae0 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68  n leaf pages, th
32af0 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69  en the child poi
32b00 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a  nters of the.  *
32b10 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * divider cells 
32b20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f  are stripped fro
32b30 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f  m the cells befo
32b40 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69  re they are copi
32b50 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70  ed.  ** into aSp
32b60 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73  ace1[].  In this
32b70 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
32b80 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20  in apCell[] are 
32b90 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69  without.  ** chi
32ba0 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66  ld pointers.  If
32bb0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
32bc0 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61  t leaves, then a
32bd0 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20  ll cell in.  ** 
32be0 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65  apCell[] include
32bf0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
32c00 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c    Either way, al
32c10 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
32c20 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69  l[].  ** are ali
32c30 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65  ke..  **.  ** le
32c40 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34  afCorrection:  4
32c50 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
32c60 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65  eaf.  0 if pPage
32c70 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a   is not a leaf..
32c80 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44    **       leafD
32c90 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65  ata:  1 if pPage
32ca0 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20   holds key+data 
32cb0 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64  and pParent hold
32cc0 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a  s only keys..  *
32cd0 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  /.  leafCorrecti
32ce0 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c  on = apOld[0]->l
32cf0 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
32d00 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61  a = apOld[0]->ha
32d10 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30  sData;.  for(i=0
32d20 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
32d30 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20      int limit;. 
32d40 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72     .    /* Befor
32d50 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
32d60 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f   else, take a co
32d70 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f  py of the i'th o
32d80 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a  riginal sibling.
32d90 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20      ** The rest 
32da0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
32db0 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66   will use data f
32dc0 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72  rom the copies r
32dd0 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  ather.    ** tha
32de0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
32df0 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
32e00 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
32e10 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20  ll be in the.   
32e20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62   ** process of b
32e30 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
32e40 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
32e50 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79  e *pOld = apCopy
32e60 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  [i] = (MemPage*)
32e70 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61  &aSpace1[pBt->pa
32e80 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20  geSize + k*i];. 
32e90 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20     memcpy(pOld, 
32ea0 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
32eb0 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
32ec0 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76  pOld->aData = (v
32ed0 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20  oid*)&pOld[1];. 
32ee0 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e     memcpy(pOld->
32ef0 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d  aData, apOld[i]-
32f00 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67  >aData, pBt->pag
32f10 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d  eSize);..    lim
32f20 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  it = pOld->nCell
32f30 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  +pOld->nOverflow
32f40 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e  ;.    if( pOld->
32f50 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20  nOverflow>0 ){. 
32f60 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
32f70 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
32f80 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
32f90 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
32fa0 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
32fb0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
32fc0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
32fd0 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
32fe0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
32ff0 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
33000 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20  ell[nCell]);.   
33010 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
33020 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
33030 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61  .      u8 *aData
33040 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a   = pOld->aData;.
33050 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61        u16 maskPa
33060 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50  ge = pOld->maskP
33070 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63  age;.      u16 c
33080 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64  ellOffset = pOld
33090 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
330a0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
330b0 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
330c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
330d0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
330e0 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43         apCell[nC
330f0 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76  ell] = findCellv
33100 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67  2(aData, maskPag
33110 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a  e, cellOffset, j
33120 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
33130 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
33140 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
33150 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20  ell[nCell]);.   
33160 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
33170 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20      }.    }     
33180 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c    .    if( i<nOl
33190 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61  d-1 && !leafData
331a0 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20  ){.      u16 sz 
331b0 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b  = (u16)szNew[i];
331c0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
331d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
331e0 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
331f0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
33200 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
33210 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
33220 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20  ce1[iSpace1];.  
33230 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73      iSpace1 += s
33240 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
33250 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63   sz<=pBt->maxLoc
33260 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61  al+23 );.      a
33270 73 73 65 72 74 28 20 69 53 70 61 63 65 31 20 3c  ssert( iSpace1 <
33280 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65  = (int)pBt->page
33290 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65  Size );.      me
332a0 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69  mcpy(pTemp, apDi
332b0 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20  v[i], sz);.     
332c0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
332d0 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
332e0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73  ction;.      ass
332f0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
33300 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f  ion==0 || leafCo
33310 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
33320 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
33330 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c  l] = szCell[nCel
33340 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74  l] - leafCorrect
33350 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ion;.      if( !
33360 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
33370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
33380 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
33390 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
333a0 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73  t( pOld->hdrOffs
333b0 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  et==0 );.       
333c0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f   /* The right po
333d0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
333e0 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63  ld page pOld bec
333f0 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20  omes the left.  
33400 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
33410 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
33420 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
33430 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43  memcpy(apCell[nC
33440 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61  ell], &pOld->aDa
33450 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[8], 4);.     
33460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33470 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
33480 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
33490 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
334a0 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
334b0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
334c0 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20  allow any cells 
334d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62  smaller than 4 b
334e0 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ytes. */.       
334f0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
33500 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 4;.        }.
33510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
33520 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell++;.    }.  }
33530 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75  ..  /*.  ** Figu
33540 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65  re out the numbe
33550 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65  r of pages neede
33560 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43  d to hold all nC
33570 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20  ell cells..  ** 
33580 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65  Store this numbe
33590 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20  r in "k".  Also 
335a0 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20  compute szNew[] 
335b0 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74  which is the tot
335c0 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  al.  ** size of 
335d0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  all cells on the
335e0 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63   i-th page and c
335f0 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73  ntNew[] which is
33600 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
33610 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74  in apCell[] of t
33620 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76  he cell that div
33630 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d  ides page i from
33640 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a   page i+1.  .  *
33650 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75  * cntNew[k] shou
33660 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a  ld equal nCell..
33670 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73    **.  ** Values
33680 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69   computed by thi
33690 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20  s block:.  **.  
336a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20  **           k: 
336b0 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
336c0 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65   of sibling page
336d0 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b  s.  **    szNew[
336e0 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20  i]: Spaced used 
336f0 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  on the i-th sibl
33700 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20  ing page..  **  
33710 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65   cntNew[i]: Inde
33720 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e  x in apCell[] an
33730 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74  d szCell[] for t
33740 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  he first cell to
33750 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
33760 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20     the right of 
33770 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
33780 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62   page..  ** usab
33790 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20  leSpace: Number 
337a0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
337b0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65  e available on e
337c0 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a  ach sibling..  *
337d0 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65  * .  */.  usable
337e0 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61  Space = pBt->usa
337f0 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c  bleSize - 12 + l
33800 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
33810 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d   for(subtotal=k=
33820 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
33830 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
33840 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  i<nMaxCells );. 
33850 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73     subtotal += s
33860 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20  zCell[i] + 2;.  
33870 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e    if( subtotal >
33880 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a   usableSpace ){.
33890 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d        szNew[k] =
338a0 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65   subtotal - szCe
338b0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74  ll[i];.      cnt
338c0 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20  New[k] = i;.    
338d0 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
338e0 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73  { i--; }.      s
338f0 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20  ubtotal = 0;.   
33900 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66     k++;.      if
33910 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d  ( k>NB+1 ){ rc =
33920 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33930 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e  BKPT; goto balan
33940 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20  ce_cleanup; }.  
33950 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b    }.  }.  szNew[
33960 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20  k] = subtotal;. 
33970 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65   cntNew[k] = nCe
33980 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a  ll;.  k++;..  /*
33990 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e  .  ** The packin
339a0 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  g computed by th
339b0 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b  e previous block
339c0 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72   is biased towar
339d0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20  d the siblings. 
339e0 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20   ** on the left 
339f0 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20  side.  The left 
33a00 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77  siblings are alw
33a10 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c  ays nearly full,
33a20 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20   while the.  ** 
33a30 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
33a40 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72  ng might be near
33a50 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
33a60 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74  block of code at
33a70 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61  tempts.  ** to a
33a80 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e  djust the packin
33a90 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f  g of siblings to
33aa0 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61   get a better ba
33ab0 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lance..  **.  **
33ac0 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
33ad0 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e   is more than an
33ae0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
33af0 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76  The packing abov
33b00 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20  e might.  ** be 
33b10 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63  so out of balanc
33b20 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67  e as to be illeg
33b30 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  al.  For example
33b40 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  , the right-most
33b50 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69  .  ** sibling mi
33b60 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c  ght be completel
33b70 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61  y empty.  This a
33b80 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74  djustment is not
33b90 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a   optional..  */.
33ba0 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30    for(i=k-1; i>0
33bb0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
33bc0 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b  szRight = szNew[
33bd0 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  i];  /* Size of 
33be0 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72  sibling on the r
33bf0 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ight */.    int 
33c00 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69  szLeft = szNew[i
33c10 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20  -1]; /* Size of 
33c20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c  sibling on the l
33c30 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  eft */.    int r
33c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
33c50 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
33c60 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65  -most cell in le
33c70 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20  ft sibling */.  
33c80 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
33c90 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
33ca0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
33cb0 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68  the left of righ
33cc0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20  t sibling */..  
33cd0 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
33ce0 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72  ] - 1;.    d = r
33cf0 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
33d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e  .    assert( d<n
33d10 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
33d20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65  assert( r<nMaxCe
33d30 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  lls );.    while
33d40 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20  ( szRight==0 || 
33d50 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
33d60 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
33d70 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20  ell[r]+2) ){.   
33d80 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a     szRight += sz
33d90 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20  Cell[d] + 2;.   
33da0 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43     szLeft -= szC
33db0 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[r] + 2;.    
33dc0 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b    cntNew[i-1]--;
33dd0 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  .      r = cntNe
33de0 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
33df0 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
33e00 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  afData;.    }.  
33e10 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52    szNew[i] = szR
33e20 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b  ight;.    szNew[
33e30 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20  i-1] = szLeft;. 
33e40 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20   }..  /* Either 
33e50 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20  we found one or 
33e60 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e  more cells (cntn
33e70 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61  ew[0])>0) or pPa
33e80 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72  ge is.  ** a vir
33e90 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
33ea0 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
33eb0 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
33ec0 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
33ed0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
33ee0 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
33ef0 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
33f00 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   page..  **.  **
33f10 20 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73   UPDATE:  The as
33f20 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20  sert() below is 
33f30 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
33f40 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
33f50 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69  base.  ** file i
33f60 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20  s corrupt.  The 
33f70 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
33f80 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20  be detected and 
33f90 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20  reported later. 
33fa0 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63   ** in this proc
33fb0 65 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69  edure so there i
33fc0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74  s no need to act
33fd0 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20   upon it now..  
33fe0 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
33ff0 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c  t( cntNew[0]>0 |
34000 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  | (pParent->pgno
34010 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==1 && pParent->
34020 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e  nCell==0) );.#en
34030 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42  dif..  TRACE(("B
34040 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
34050 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
34060 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
34070 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
34080 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
34090 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
340a0 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
340b0 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
340c0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
340d0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
340e0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
340f0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
34100 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
34110 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
34120 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34130 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
34140 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
34150 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67  ;.  }.  pageFlag
34160 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44  s = apOld[0]->aD
34170 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
34180 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
34190 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
341a0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
341b0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
341c0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
341d0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
341e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
341f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34200 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
34210 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
34220 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
34230 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
34240 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
34250 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
34260 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
34270 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
34280 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
34290 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30  , &pgno, pgno, 0
342a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
342b0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
342c0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
342d0 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
342e0 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20       nNew++;..  
342f0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70      /* Set the p
34300 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
34310 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62   for the new sib
34320 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
34330 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
34340 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
34350 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
34360 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  New->pgno, PTRMA
34370 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
34380 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
34390 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
343a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
343b0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
343c0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
343d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
343e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
343f0 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
34400 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
34410 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
34420 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
34430 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66   i<nOld ){.    f
34440 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
34450 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
34460 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
34470 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
34480 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
34490 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
344a0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
344b0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
344c0 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
344d0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
344e0 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
344f0 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
34500 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
34510 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
34520 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
34530 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
34540 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
34550 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
34560 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
34570 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
34580 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
34590 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
345a0 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
345b0 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
345c0 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
345d0 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
345e0 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
345f0 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
34600 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
34610 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
34620 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
34630 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
34640 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
34650 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
34660 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
34670 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
34680 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
34690 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
346a0 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
346b0 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
346c0 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
346d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
346e0 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
346f0 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70     int minV = ap
34700 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
34710 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
34720 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
34730 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
34740 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  if( apNew[j]->pg
34750 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  no<(unsigned)min
34760 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
34770 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
34780 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e  inV = apNew[j]->
34790 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
347a0 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
347b0 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  >i ){.      MemP
347c0 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 70  age *pT;.      p
347d0 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
347e0 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
347f0 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
34800 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
34810 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
34820 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28  TRACE(("new: %d(
34830 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
34840 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
34850 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d  n",.    apNew[0]
34860 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d  ->pgno, szNew[0]
34870 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
34880 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apNew[1]->pgno :
34890 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
348a0 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
348b0 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b  nNew>=3 ? apNew[
348c0 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  2]->pgno : 0, nN
348d0 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
348e0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
348f0 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67  4 ? apNew[3]->pg
34900 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  no : 0, nNew>=4 
34910 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
34920 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70      nNew>=5 ? ap
34930 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[4]->pgno : 0
34940 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
34950 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61  w[4] : 0));..  a
34960 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
34970 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
34980 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
34990 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70   );.  put4byte(p
349a0 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65  Right, apNew[nNe
349b0 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  w-1]->pgno);..  
349c0 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
349d0 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
349e0 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
349f0 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
34a00 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
34a10 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
34a20 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
34a30 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
34a40 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
34a50 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
34a60 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
34a70 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
34a80 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
34a90 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
34aa0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
34ab0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
34ac0 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
34ad0 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
34ae0 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
34af0 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
34b00 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
34b10 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
34b20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
34b30 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
34b40 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
34b50 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
34b60 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
34b70 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
34b80 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
34b90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
34ba0 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
34bb0 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
34bc0 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
34bd0 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
34be0 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
34bf0 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
34c00 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
34c10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
34c20 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d   i<nNew-1 || j==
34c30 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
34c40 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
34c50 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
34c60 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
34c70 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
34c80 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
34c90 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
34ca0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
34cb0 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
34cc0 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
34cd0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
34ce0 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70  pTemp = &aOvflSp
34cf0 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b  ace[iOvflSpace];
34d00 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
34d10 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
34d20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
34d30 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
34d40 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
34d50 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
34d60 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
34d70 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
34d80 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
34d90 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
34da0 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
34db0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
34dc0 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
34dd0 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
34de0 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
34df0 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
34e00 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
34e10 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
34e20 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
34e30 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
34e40 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
34e50 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
34e60 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
34e70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34e80 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
34e90 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
34ea0 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
34eb0 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
34ec0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
34ed0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
34ee0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20   = pTemp;.      
34ef0 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61    sz = 4 + putVa
34f00 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
34f10 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20  info.nKey);.    
34f20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
34f30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34f40 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
34f50 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75          /* Obscu
34f60 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d  re case for non-
34f70 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a  leaf-data trees:
34f80 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20   If the cell at 
34f90 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20  pCell was.      
34fa0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
34fb0 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66  stored on a leaf
34fc0 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72   node, and its r
34fd0 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
34fe0 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
34ff0 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
35000 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
35010 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
35020 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
35030 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
35040 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
35050 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
35060 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
35070 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
35080 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
35090 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
350a0 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
350b0 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
350c0 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
350d0 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
350e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
350f0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
35100 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
35110 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
35120 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
35130 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
35140 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
35150 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
35160 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
35170 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
35180 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
35190 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
351a0 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
351b0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
351c0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
351d0 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
351e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
351f0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
35200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
35210 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
35220 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
35230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35240 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63  .      iOvflSpac
35250 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  e += sz;.      a
35260 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
35270 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
35280 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 76       assert( iOv
35290 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74 29  flSpace <= (int)
352a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
352b0 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c  .      insertCel
352c0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
352d0 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
352e0 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  mp, pNew->pgno, 
352f0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
35300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
35310 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
35320 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65  anup;.      asse
35330 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
35340 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
35350 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
35360 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  ..      j++;.   
35370 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
35380 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
35390 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
353a0 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
353b0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
353c0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
353d0 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
353e0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  ==0 ){.    u8 *z
353f0 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b  Child = &apCopy[
35400 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
35410 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ];.    memcpy(&a
35420 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
35430 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20  ata[8], zChild, 
35440 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  4);.  }..  if( i
35450 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74  sRoot && pParent
35460 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
35470 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
35480 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  <=apNew[0]->nFre
35490 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e ){.    /* The 
354a0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
354b0 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74   b-tree now cont
354c0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54  ains no cells. T
354d0 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a  he only sibling.
354e0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74      ** page is t
354f0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
35500 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f  f the parent. Co
35510 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
35520 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68  of the.    ** ch
35530 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68  ild page into th
35540 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61  e parent, decrea
35550 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c  sing the overall
35560 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20   height of the. 
35570 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72     ** b-tree str
35580 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54  ucture by one. T
35590 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64  his is described
355a0 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65   as the "balance
355b0 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20  -shallower".    
355c0 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d  ** sub-algorithm
355d0 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e   in some documen
355e0 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20  tation..    **. 
355f0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
35600 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
35610 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61  database, the ca
35620 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f  ll to copyNodeCo
35630 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20  ntent() .    ** 
35640 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72  sets all pointer
35650 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
35660 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61  responding to da
35670 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67  tabase image pag
35680 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77  es .    ** for w
35690 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72  hich the pointer
356a0 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69   is stored withi
356b0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  n the content be
356c0 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20  ing copied..    
356d0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
356e0 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f  cond assert belo
356f0 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  w verifies that 
35700 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69  the child page i
35710 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20  s defragmented. 
35720 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62     ** (it must b
35730 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73  e, as it was jus
35740 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20  t reconstructed 
35750 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61  using assemblePa
35760 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20  ge()). This.    
35770 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ** is important 
35780 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  if the parent pa
35790 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
357a0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
357b0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69  atabase.    ** i
357c0 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  mage.  */.    as
357d0 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b  sert( nNew==1 );
357e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e  .    assert( apN
357f0 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20  ew[0]->nFree == 
35800 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79  .        (get2by
35810 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44  te(&apNew[0]->aD
35820 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d  ata[5])-apNew[0]
35830 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e  ->cellOffset-apN
35840 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20  ew[0]->nCell*2) 
35850 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79  .    );.    copy
35860 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65  NodeContent(apNe
35870 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26  w[0], pParent, &
35880 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67  rc);.    freePag
35890 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29  e(apNew[0], &rc)
358a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  ;.  }else if( IS
358b0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
358c0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
358d0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
358e0 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
358f0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
35900 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
35910 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
35920 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
35930 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
35940 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
35950 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
35960 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
35970 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
35980 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
35990 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
359a0 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
359b0 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
359c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
359d0 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
359e0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
359f0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
35a00 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
35a10 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
35a20 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
35a30 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
35a40 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
35a50 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
35a60 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
35a70 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
35a80 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
35a90 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
35aa0 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
35ab0 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
35ac0 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
35ad0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
35ae0 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
35af0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
35b00 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
35b10 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
35b20 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
35b30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35b40 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
35b50 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
35b60 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
35b70 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
35b80 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
35b90 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
35ba0 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
35bb0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
35bc0 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
35bd0 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
35be0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
35bf0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
35c00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
35c10 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
35c20 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
35c30 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
35c40 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
35c50 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
35c60 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
35c70 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
35c80 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
35c90 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
35ca0 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
35cb0 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
35cc0 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
35cd0 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
35ce0 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
35cf0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
35d00 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
35d10 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
35d20 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
35d30 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
35d40 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
35d50 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
35d60 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
35d70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
35d80 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
35d90 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
35da0 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
35db0 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
35dc0 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
35dd0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
35de0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
35df0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
35e00 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
35e10 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
35e20 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
35e30 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
35e40 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
35e50 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
35e60 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
35e70 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
35e80 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
35e90 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
35ea0 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
35eb0 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
35ec0 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
35ed0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
35ee0 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
35ef0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
35f00 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
35f10 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
35f20 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
35f30 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
35f40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
35f50 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
35f60 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
35f70 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
35f80 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
35f90 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
35fa0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
35fb0 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
35fc0 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
35fd0 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
35fe0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
35ff0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
36000 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
36010 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
36020 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
36030 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20  pOld->aiOvfl[0] 
36040 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30  : -1);.    j = 0
36050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36070 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73   Current 'old' s
36080 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
36090 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20     k = 0;       
360a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
360b0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
360c0 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70   'new' sibling p
360d0 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  age */.    for(i
360e0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
360f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
36100 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
36110 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
36120 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
36130 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
36140 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
36150 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
36160 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
36170 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
36180 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
36190 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
361a0 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
361b0 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
361c0 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
361d0 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
361e0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
361f0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
36200 28 20 6a 2b 31 20 3c 20 41 72 72 61 79 53 69 7a  ( j+1 < ArraySiz
36210 65 28 61 70 43 6f 70 79 29 20 29 3b 0a 20 20 20  e(apCopy) );.   
36220 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f       pOld = apCo
36230 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20  py[++j];.       
36240 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20   iNextOld = i + 
36250 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
36260 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e  ->nCell + pOld->
36270 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
36280 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
36290 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
362a0 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20      nOverflow = 
362b0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
362c0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
362d0 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66  flow = i + !leaf
362e0 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 69 4f  Data + pOld->aiO
362f0 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  vfl[0];.        
36300 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  }.        isDivi
36310 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b  der = !leafData;
36320 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
36330 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
36340 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f  ow>0 || iOverflo
36350 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73  w<i );.      ass
36360 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20  ert(nOverflow<2 
36370 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b  || pOld->aiOvfl[
36380 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  0]==pOld->aiOvfl
36390 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 61 73  [1]-1);.      as
363a0 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33  sert(nOverflow<3
363b0 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c   || pOld->aiOvfl
363c0 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66  [1]==pOld->aiOvf
363d0 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20 20 20 20 69  l[2]-1);.      i
363e0 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20  f( i==iOverflow 
363f0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76  ){.        isDiv
36400 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ider = 1;.      
36410 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c    if( (--nOverfl
36420 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ow)>0 ){.       
36430 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a     iOverflow++;.
36440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36450 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  }..      if( i==
36460 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20  cntNew[k] ){.   
36470 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
36480 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
36490 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
364a0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
364b0 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a  n new.        **
364c0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e   sibling page k.
364d0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
364e0 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
364f0 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
36500 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
36510 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
36520 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  is a divider cel
36530 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  l.  */.        p
36540 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d  New = apNew[++k]
36550 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  ;.        if( !l
36560 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e  eafData ) contin
36570 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
36580 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64    assert( j<nOld
36590 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
365a0 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20  ( k<nNew );..   
365b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c     /* If the cel
365c0 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  l was originally
365d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61   divider cell (a
365e0 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f  nd is not now) o
365f0 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76  r.      ** an ov
36600 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20  erflow cell, or 
36610 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20  if the cell was 
36620 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66  located on a dif
36630 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20  ferent sibling. 
36640 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66       ** page bef
36650 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e  ore the balancin
36660 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  g, then the poin
36670 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
36680 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20  associated.     
36690 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69   ** with any chi
366a0 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
366b0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
366c0 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  updated.  */.   
366d0 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72     if( isDivider
366e0 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d   || pOld->pgno!=
366f0 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
36700 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43        if( !leafC
36710 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  orrection ){.   
36720 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
36730 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61  (pBt, get4byte(a
36740 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41  pCell[i]), PTRMA
36750 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
36760 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
36770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
36780 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d   szCell[i]>pNew-
36790 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
367a0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
367b0 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  OvflPtr(pNew, ap
367c0 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  Cell[i], &rc);. 
367d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
367e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
367f0 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
36800 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
36810 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
36820 20 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20          u32 key 
36830 3d 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65  = get4byte(&apNe
36840 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  w[i]->aData[8]);
36850 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
36860 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52  ut(pBt, key, PTR
36870 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
36880 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  [i]->pgno, &rc);
36890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
368a0 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65  #if 0.    /* The
368b0 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
368c0 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73  s() contains ass
368d0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
368e0 20 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61   that verify tha
368f0 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69  t.    ** all poi
36900 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61  nter map pages a
36910 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  re set correctly
36920 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75  . This is helpfu
36930 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20  l while .    ** 
36940 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20  debugging. This 
36950 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62  is usually disab
36960 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f  led because a co
36970 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d  rrupt database m
36980 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20  ay.    ** cause 
36990 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
369a0 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20  ement to fail.  
369b0 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65  */.    ptrmapChe
369c0 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e  ckPages(apNew, n
369d0 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  New);.    ptrmap
369e0 43 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72  CheckPages(&pPar
369f0 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ent, 1);.#endif.
36a00 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
36a10 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
36a20 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
36a30 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f  NCE: finished: o
36a40 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
36a50 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
36a60 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20      nOld, nNew, 
36a70 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20  nCell));..  /*. 
36a80 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f   ** Cleanup befo
36a90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20  re returning..  
36aa0 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  */.balance_clean
36ab0 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72  up:.  sqlite3Scr
36ac0 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
36ad0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
36ae0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
36af0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
36b00 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
36b10 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
36b20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
36b30 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
36b40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
36b50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
36b60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
36b70 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20  d when the root 
36b80 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
36b90 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a   structure is.**
36ba0 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f   overfull (has o
36bb0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
36bc0 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a  low pages)..**.*
36bd0 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61  * A new child pa
36be0 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ge is allocated 
36bf0 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
36c00 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
36c10 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e  root.** page, in
36c20 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77  cluding overflow
36c30 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69   cells, are copi
36c40 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c  ed into the chil
36c50 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  d. The root.** p
36c60 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72  age is then over
36c70 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20  written to make 
36c80 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  it an empty page
36c90 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d   with the right-
36ca0 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  child .** pointe
36cb0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
36cc0 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a  e new page..**.*
36cd0 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
36ce0 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ng, all pointer-
36cf0 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
36d00 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
36d10 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  es .** that the 
36d20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e  new child-page n
36d30 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  ow contains poin
36d40 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61  ters to are upda
36d50 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72  ted. The.** entr
36d60 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
36d70 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74  to the new right
36d80 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
36d90 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  f the root.** pa
36da0 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  ge is also updat
36db0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
36dc0 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c  cessful, *ppChil
36dd0 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74  d is set to cont
36de0 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
36df0 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a  to the child .**
36e00 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45   page and SQLITE
36e10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
36e20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
36e30 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75  e caller is requ
36e40 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20  ired.** to call 
36e50 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e  releasePage() on
36e60 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c   *ppChild exactl
36e70 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72  y once. If an er
36e80 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61  ror occurs,.** a
36e90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
36ea0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
36eb0 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
36ec0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
36ed0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
36ee0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20  MemPage *pRoot, 
36ef0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c  MemPage **ppChil
36f00 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  d){.  int rc;   
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
36f30 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
36f40 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
36f50 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30  Page *pChild = 0
36f60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
36f70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
36f80 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
36f90 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
36fa0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
36fb0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
36fc0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
36fd0 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
36fe0 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e  d *pBt = pRoot->
36ff0 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42  pBt;    /* The B
37000 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Tree */..  asser
37010 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  t( pRoot->nOverf
37020 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  low>0 );.  asser
37030 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
37040 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
37050 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ) );..  /* Make 
37060 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20  pRoot, the root 
37070 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
37080 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c  ee, writable. Al
37090 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20  locate a new .  
370a0 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ** page that wil
370b0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
370c0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
370d0 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20  pPage. Copy the 
370e0 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
370f0 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64   the node stored
37100 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74   on pRoot into t
37110 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
37120 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
37130 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37140 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
37150 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
37160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
37170 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
37180 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
37190 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74  &pgnoChild,pRoot
371a0 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63  ->pgno,0);.    c
371b0 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70  opyNodeContent(p
371c0 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72  Root, pChild, &r
371d0 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55  c);.    if( ISAU
371e0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
371f0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
37200 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d   pgnoChild, PTRM
37210 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d  AP_BTREE, pRoot-
37220 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
37230 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
37240 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20  ){.    *ppChild 
37250 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
37260 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
37270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
37280 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37290 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
372a0 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
372b0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
372c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
372d0 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e  riteable(pRoot->
372e0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
372f0 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
37300 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c  ell==pRoot->nCel
37310 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  l );..  TRACE(("
37320 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
37330 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
37340 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70  , pRoot->pgno, p
37350 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  Child->pgno));..
37360 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76    /* Copy the ov
37370 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f  erflow cells fro
37380 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c  m pRoot to pChil
37390 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43  d */.  memcpy(pC
373a0 68 69 6c 64 2d 3e 61 69 4f 76 66 6c 2c 20 70 52  hild->aiOvfl, pR
373b0 6f 6f 74 2d 3e 61 69 4f 76 66 6c 2c 0a 20 20 20  oot->aiOvfl,.   
373c0 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6e 4f 76        pRoot->nOv
373d0 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
373e0 6f 6f 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 29 29  oot->aiOvfl[0]))
373f0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c  ;.  memcpy(pChil
37400 64 2d 3e 61 70 4f 76 66 6c 2c 20 70 52 6f 6f 74  d->apOvfl, pRoot
37410 2d 3e 61 70 4f 76 66 6c 2c 0a 20 20 20 20 20 20  ->apOvfl,.      
37420 20 20 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66     pRoot->nOverf
37430 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74  low*sizeof(pRoot
37440 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  ->apOvfl[0]));. 
37450 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
37460 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ow = pRoot->nOve
37470 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rflow;..  /* Zer
37480 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
37490 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e  f pRoot. Then in
374a0 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20  stall pChild as 
374b0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e  the right-child.
374c0 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   */.  zeroPage(p
374d0 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Root, pChild->aD
374e0 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
374f0 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
37500 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
37510 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
37520 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a  ], pgnoChild);..
37530 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68    *ppChild = pCh
37540 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ild;.  return SQ
37550 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
37560 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
37570 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCur currently p
37580 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73  oints to has jus
37590 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
375a0 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20  in.** some way. 
375b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
375c0 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69  gures out if thi
375d0 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  s modification m
375e0 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65  eans the.** tree
375f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
37600 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anced, and if so
37610 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f   calls the appro
37620 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
37630 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61   .** routine. Ba
37640 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73  lancing routines
37650 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61   are:.**.**   ba
37660 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a  lance_quick().**
37670 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
37680 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
37690 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74  _nonroot().*/.st
376a0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
376b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
376c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
376d0 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
376e0 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d  int nMin = pCur-
376f0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
37700 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61   * 2 / 3;.  u8 a
37710 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
37720 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72  e[13];.  u8 *pFr
37730 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f  ee = 0;..  TESTO
37740 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
37750 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20  _quick_called = 
37760 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
37770 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
37780 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  per_called = 0 )
37790 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
377a0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
377b0 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61  iPage;.    MemPa
377c0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
377d0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b  ->apPage[iPage];
377e0 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d  ..    if( iPage=
377f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
37800 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37810 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
37820 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
37830 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76  the b-tree is ov
37840 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
37850 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20  case call the.  
37860 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
37870 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69  _deeper() functi
37880 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  on to create a n
37890 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65  ew child for the
378a0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
378b0 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74     ** and copy t
378c0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
378d0 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  nts of the root-
378e0 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a  page to it. The.
378f0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20          ** next 
37900 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
37910 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
37920 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20  lance the child 
37930 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
37940 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
37950 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ( (balance_deepe
37960 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  r_called++)==0 )
37970 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
37980 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
37990 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  age, &pCur->apPa
379a0 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[1]);.        
379b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
379c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
379d0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a  Cur->iPage = 1;.
379e0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
379f0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
37a00 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
37a10 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[1] = 0;.    
37a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
37a30 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e  ur->apPage[1]->n
37a40 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20  Overflow );.    
37a50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
37a60 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e{.        break
37a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
37a80 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  lse if( pPage->n
37a90 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
37aa0 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69  Page->nFree<=nMi
37ab0 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  n ){.      break
37ac0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37ad0 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e     MemPage * con
37ae0 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75  st pParent = pCu
37af0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d  r->apPage[iPage-
37b00 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  1];.      int co
37b10 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d  nst iIdx = pCur-
37b20 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b  >aiIdx[iPage-1];
37b30 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
37b40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37b50 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
37b60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
37b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
37b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37b90 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
37ba0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
37bb0 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20  >hasData.       
37bc0 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65    && pPage->nOve
37bd0 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20  rflow==1.       
37be0 20 20 26 26 20 70 50 61 67 65 2d 3e 61 69 4f 76    && pPage->aiOv
37bf0 66 6c 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e 6e 43  fl[0]==pPage->nC
37c00 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ell.         && 
37c10 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
37c20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
37c30 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64  rent->nCell==iId
37c40 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  x.        ){.   
37c50 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62         /* Call b
37c60 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74  alance_quick() t
37c70 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  o create a new s
37c80 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20  ibling of pPage 
37c90 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  on which.       
37ca0 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74     ** to store t
37cb0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
37cc0 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  . balance_quick(
37cd0 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20  ) inserts a new 
37ce0 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  cell.          *
37cf0 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20  * into pParent, 
37d00 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
37d10 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  pParent overflow
37d20 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20  . If this.      
37d30 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
37d40 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74  the next interat
37d50 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
37d60 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
37d70 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20  pParent .       
37d80 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72     ** use either
37d90 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37da0 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65  () or balance_de
37db0 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68  eper(). Until th
37dc0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
37dd0 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65  happens, the ove
37de0 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74  rflow cell is st
37df0 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c  ored in the aBal
37e00 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
37e10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
37e20 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20  ffer. .         
37e30 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
37e40 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
37e50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
37e60 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65  sert() is to che
37e70 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20  ck that only a. 
37e80 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
37e90 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  le call to balan
37ea0 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61  ce_quick() is ma
37eb0 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  de for each call
37ec0 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20   to this.       
37ed0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
37ee0 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74  If this were not
37ef0 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62   verified, a sub
37f00 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e  tle bug involvin
37f10 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20  g reuse.        
37f20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c    ** of the aBal
37f30 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
37f40 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e   might sneak in.
37f50 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
37f60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37f70 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63  (balance_quick_c
37f80 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
37f90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
37fa0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72  lance_quick(pPar
37fb0 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c  ent, pPage, aBal
37fc0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b  anceQuickSpace);
37fd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
37fe0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
37ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
38000 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20  this case, call 
38010 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
38020 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74  ) to redistribut
38030 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  e cells.        
38040 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61    ** between pPa
38050 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f  ge and up to 2 o
38060 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61  f its sibling pa
38070 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ges. This involv
38080 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
38090 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
380a0 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e  ntents of pParen
380b0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
380c0 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20  se pParent to.  
380d0 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d          ** becom
380e0 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
380f0 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78  derfull. The nex
38100 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
38110 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20  he do-loop.     
38120 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c       ** will bal
38130 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
38140 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20  page to correct 
38150 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20  this..          
38160 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
38170 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   If the parent p
38180 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
38190 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c  full, the overfl
381a0 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73  ow cell or cells
381b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
381c0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
381d0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c  pSpace buffer al
381e0 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74  located immediat
381f0 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20  ely below. .    
38200 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65        ** A subse
38210 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  quent iteration 
38220 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
38230 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68  ill deal with th
38240 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  is by.          
38250 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e  ** calling balan
38260 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61  ce_nonroot() (ba
38270 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d  lance_deeper() m
38280 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ay be called fir
38290 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  st,.          **
382a0 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20   but it doesn't 
382b0 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c  deal with overfl
382c0 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20  ow cells - just 
382d0 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a  moves them to a.
382e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66            ** dif
382f0 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e  ferent page). On
38300 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65  ce this subseque
38310 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  nt call to balan
38320 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20  ce_nonroot() .  
38330 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63          ** has c
38340 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20  ompleted, it is 
38350 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20  safe to release 
38360 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
38370 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20  r used by.      
38380 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69      ** the previ
38390 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  ous call, as the
383a0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64   overflow cell d
383b0 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ata will have be
383c0 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  en .          **
383d0 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69   copied either i
383e0 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
383f0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
38400 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  or into the new.
38410 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70            ** pSp
38420 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65  ace buffer passe
38430 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20  d to the latter 
38440 63 61 6c 6c 20 74 6f 20 6