/ Hex Artifact Content
Login

Artifact 60e0151ccc9d1d09a3fd2d0e609689ab8544e93f:


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: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5690: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
56a0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
56b0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
56c0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
56d0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
56e0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
56f0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
5700: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
5710: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
5720: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
5730: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
5740: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5750: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5760: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5770: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
5780: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
5790: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
57a0: 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  dxKey);.  }else{
57b0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
57c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
57d0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57e0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57f0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
5800: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
5810: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
5820: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
5830: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
5840: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
5850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5860: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
5870: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
5880: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
5890: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
58a0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
58b0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
58c0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
58d0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
58e0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
58f0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
5900: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
5910: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
5920: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
5930: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
5940: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
5950: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
5960: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
5970: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
5980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5990: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
59a0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
59d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
59e0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
59f0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5a00: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5a10: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5a20: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
5a30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
5a40: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
5a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
5a60: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
5a70: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5a80: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5a90: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
5aa0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
5ab0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
5ac0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
5ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
5ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
5b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
5b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
5b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
5b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
5b70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
5b80: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
5b90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
5ba0: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
5bb0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5bc0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
5bd0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
5be0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
5bf0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
5c00: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
5c10: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
5c20: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
5c30: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
5c40: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
5c50: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
5c60: 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e  at.  Cursors can
5c70: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
5c80: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
5c90: 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65  ting.** at is de
5ca0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
5cb0: 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  nder them..**.**
5cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5cd0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63  turns an error c
5ce0: 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ode if something
5cf0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68   goes wrong.  Th
5d00: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48  e.** integer *pH
5d10: 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  asMoved is set t
5d20: 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72  o one if the cur
5d30: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e  sor has moved an
5d40: 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  d 0 if not..*/.i
5d50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
5d60: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
5d70: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5d80: 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20  t *pHasMoved){. 
5d90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
5da0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5db0: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
5dc0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
5dd0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5df0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
5e00: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
5e10: 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e  D || pCur->skipN
5e20: 65 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ext!=0 ){.    *p
5e30: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
5e50: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Moved = 0;.  }. 
5e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e70: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
5e80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5e90: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
5ea0: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
5eb0: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
5ec0: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
5ed0: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
5ee0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
5ef0: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
5f00: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
5f10: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
5f20: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
5f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
5f40: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
5f50: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
5f60: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
5f70: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
5f80: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
5f90: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
5fa0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
5fb0: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
5fc0: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
5fd0: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
5fe0: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
5ff0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
6000: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
6010: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
6020: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
6030: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
6040: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6050: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6060: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
6070: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
6080: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
6090: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
60a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
60b0: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
60c0: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
60d0: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
60e0: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
60f0: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
6100: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
6110: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
6120: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
6130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6140: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
6150: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
6160: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6180: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
6190: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
61a0: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
61b0: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
61c0: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
61d0: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
61e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
61f0: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
6200: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
6210: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
6220: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
6230: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6240: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
6250: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6260: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
6270: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
6280: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
6290: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
62a0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
62b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
62c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
62d0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
62e0: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
62f0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6300: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6310: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
6320: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6330: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6340: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
6350: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
6360: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6370: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
6380: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6390: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
63a0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
63b0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
63c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
63d0: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
63e0: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
63f0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
6400: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
6410: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6420: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6430: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
6440: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
6450: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
6460: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
6470: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
6480: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
6490: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
64a0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
64b0: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
64c0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
64d0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
64e0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
64f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6500: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
6510: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
6520: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6530: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6550: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6560: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6570: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6580: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6590: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
65a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
65b0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
65c0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
65d0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
65e0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70  fset<0 ){.    *p
65f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6600: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
6610: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
6620: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6630: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6650: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
6660: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6670: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6680: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
6690: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
66a0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
66b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
66c0: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
66d0: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
66e0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
66f0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
6700: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
6710: 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74  *pRC= rc = sqlit
6720: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
6730: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
6740: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6750: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
6760: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
6770: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
6780: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6790: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
67a0: 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69  .  }..ptrmap_exi
67b0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t:.  sqlite3Page
67c0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
67d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
67e0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
67f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
6800: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6810: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
6820: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6830: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6840: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6850: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6860: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6870: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6880: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6890: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
68a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
68b0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
68c0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
68d0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
68e0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
68f0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
6900: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
6910: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
6920: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
6930: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6940: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6950: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6960: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6970: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
6980: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
6990: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
69a0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
69b0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
69c0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
69d0: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
69e0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
69f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
6a00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6a10: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6a20: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
6a30: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
6a40: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
6a50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
6a60: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
6a70: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
6a80: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
6a90: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6aa0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
6ab0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6ac0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6ad0: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
6ae0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
6af0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
6b00: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
6b10: 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et<0 ){.    sqli
6b20: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6b30: 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  bPage);.    retu
6b40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6b50: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
6b60: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6b70: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6b80: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65  Size-5 );.  asse
6b90: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
6ba0: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
6bb0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
6bc0: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
6bd0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
6be0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6bf0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
6c00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6c10: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
6c20: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
6c30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
6c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c60: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
6c70: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
6c80: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
6c90: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
6ca0: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
6cb0: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
6cc0: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
6cd0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
6ce0: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
6cf0: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
6d00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
6d10: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
6d20: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
6d30: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
6d40: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
6d50: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
6d60: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
6d70: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
6d80: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
6d90: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
6da0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
6db0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
6dc0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
6dd0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
6de0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
6df0: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
6e00: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
6e10: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
6e20: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
6e30: 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61  get2byte(&(P)->a
6e40: 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66  Data[(P)->cellOf
6e50: 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 23  fset+2*(I)]))).#
6e60: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 76  define findCellv
6e70: 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d  2(D,M,O,I) (D+(M
6e80: 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b 32  &get2byte(D+(O+2
6e90: 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I))))).../*.**
6ea0: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
6eb0: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
6ec0: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
6ed0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
6ee0: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
6ef0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6f00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
6f10: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
6f20: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6f30: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
6f40: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
6f50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6f60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6f70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
6f80: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
6f90: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
6fa0: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
6fb0: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
6fc0: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
6fd0: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
6fe0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
6ff0: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
7000: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
7010: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
7020: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
7030: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
7040: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
7050: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7070: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7080: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7090: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
70a0: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
70b0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
70c0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
70d0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
70e0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
70f0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7100: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7110: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7120: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7130: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7140: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7150: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7160: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7170: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7180: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7190: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
71a0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
71b0: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
71c0: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
71d0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
71e0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
71f0: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
7200: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
7210: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
7220: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
7230: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7240: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
7250: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
7260: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
7270: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
7280: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
7290: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
72a0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
72b0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
72c0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
72d0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
72e0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
72f0: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
7300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7310: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
7320: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
7330: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
7340: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7350: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7360: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
7370: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
7380: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7390: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
73a0: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
73b0: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
73c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
73d0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
73e0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
73f0: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
7400: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
7410: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
7420: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
7430: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7440: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7450: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7460: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7470: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7480: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
7490: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
74a0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
74b0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
74c0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
74d0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
74e0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
74f0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
7500: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
7510: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
7520: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7530: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
7540: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
7550: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
7560: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
7570: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
7580: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
7590: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74  ader = n;.  test
75a0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
75b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
75c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
75d0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
75e0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
75f0: 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c  if( likely(nPayl
7600: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
7610: 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
7620: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
7630: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
7640: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
7650: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
7660: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
7670: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
7680: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
7690: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
76a0: 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20  (pInfo->nSize = 
76b0: 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61 64  (u16)(n+nPayload
76c0: 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ))<4 ) pInfo->nS
76d0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
76e0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
76f0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
7700: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7710: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7720: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
7730: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
7740: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
7750: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
7760: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
7770: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
7780: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
7790: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
77a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
77b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
77c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
77d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
77e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
77f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
7800: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
7810: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
7820: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
7830: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
7840: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
7850: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
7860: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
7870: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
7880: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
7890: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
78a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
78b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
78c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
78d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
78e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
78f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
7900: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
7910: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7920: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7930: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
7940: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
7950: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7960: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7970: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
7980: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
7990: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
79a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
79b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
79c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
79d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
79e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
79f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
7a00: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
7a10: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
7a20: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
7a30: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7a40: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
7a50: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7a60: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
7a70: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
7a80: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
7a90: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
7aa0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
7ab0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7ac0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
7ad0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
7ae0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7af0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
7b00: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
7b10: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7b20: 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e   = (u16)(pInfo->
7b30: 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20  nLocal + n);.   
7b40: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
7b50: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7b60: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
7b70: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
7b80: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
7b90: 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73  o) \.  btreePars
7ba0: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
7bb0: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
7bc0: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
7bd0: 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f  Info)).static vo
7be0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
7bf0: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
7c00: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7c10: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7c20: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
7c30: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
7c40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
7c50: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
7c60: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
7c70: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
7c80: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
7c90: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
7ca0: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
7cb0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7cc0: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
7cd0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
7ce0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
7cf0: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
7d00: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
7d10: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
7d20: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
7d30: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
7d40: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
7d50: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
7d60: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
7d70: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
7d80: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
7d90: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
7da0: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
7db0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
7dc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
7dd0: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
7de0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
7df0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
7e00: 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67  er = &pCell[pPag
7e10: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
7e20: 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a  ;.  u32 nSize;..
7e30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7e40: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
7e50: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
7e60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
7e70: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
7e80: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
7e90: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
7ea0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
7eb0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
7ec0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
7ed0: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
7ee0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
7ef0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
7f00: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
7f10: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
7f20: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
7f30: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
7f40: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
7f50: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
7f60: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72  debuginfo;.  btr
7f70: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
7f80: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
7f90: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
7fa0: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ..  if( pPage->i
7fb0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20  ntKey ){.    u8 
7fc0: 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  *pEnd;.    if( p
7fd0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7fe0: 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  .      pIter += 
7ff0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
8000: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d  r, nSize);.    }
8010: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
8020: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
8030: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
8040: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
8050: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
8060: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
8070: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
8080: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8090: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
80a0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
80b0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
80c0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
80d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
80e0: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
80f0: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8100: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8110: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8120: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
8140: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
8150: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
8160: 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65  .  }..  testcase
8170: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8180: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
8190: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
81a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
81b0: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e   );.  if( nSize>
81c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
81d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  ){.    int minLo
81e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
81f0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
8200: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
8210: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
8220: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
8230: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
8240: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
8250: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
8260: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
8270: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8280: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8290: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
82a0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
82b0: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
82c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
82d0: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
82e0: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d  ;.  }.  nSize +=
82f0: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
8300: 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Cell);..  /* The
8310: 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
8320: 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62   any cell is 4 b
8330: 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  ytes. */.  if( n
8340: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53  Size<4 ){.    nS
8350: 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  ize = 4;.  }..  
8360: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
8370: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29  ebuginfo.nSize )
8380: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
8390: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  nSize;.}..#ifdef
83a0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
83b0: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
83c0: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
83d0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
83e0: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
83f0: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
8400: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
8410: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
8420: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
8430: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
8440: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
8450: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
8460: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
8470: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8480: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8490: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
84a0: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
84b0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
84c0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
84d0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
84e0: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
84f0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
8500: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
8510: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
8520: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
8530: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
8540: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
8550: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8560: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
8570: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
8580: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8590: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
85a0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65  ll!=0 );.  btree
85b0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
85c0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
85d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
85e0: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
85f0: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
8600: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
8610: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  load );.  if( in
8620: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
8630: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
8640: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
8650: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
8660: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
8670: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
8680: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
8690: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
86a0: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
86b0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
86c0: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
86d0: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
86e0: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
86f0: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
8700: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
8710: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
8720: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
8730: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
8740: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
8750: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
8760: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
8770: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
8780: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8790: 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rea..*/.static i
87a0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
87b0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
87c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
87f0: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8810: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
8820: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
8830: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
8840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8850: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
8860: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
8870: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
8880: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8890: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
88a0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
88b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
88c0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
88d0: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
88e0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
88f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8900: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
8910: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
8920: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8950: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8960: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
8970: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
89a0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
89b0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
89c0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
89d0: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
89e0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
89f0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
8a00: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
8a10: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
8a20: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
8a30: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
8a40: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
8a50: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
8a60: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
8a70: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
8a80: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
8a90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8aa0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8ab0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8ac0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8ad0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
8ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8af0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8b00: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
8b10: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
8b20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
8b30: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
8b40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8b50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8b60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8b70: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
8b80: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
8b90: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
8ba0: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
8bb0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
8bc0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8bd0: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
8be0: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
8bf0: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
8c00: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
8c10: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
8c20: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
8c30: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
8c40: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
8c50: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8c60: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
8c70: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8c80: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
8c90: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
8ca0: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
8cb0: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
8cc0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
8cd0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
8ce0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
8cf0: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
8d00: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
8d10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
8d20: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
8d30: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
8d40: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
8d50: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
8d60: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
8d70: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
8d80: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
8d90: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
8da0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8db0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
8dc0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8dd0: 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65  lLast );.#if !de
8de0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8df0: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8e00: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20  L_CHECK).    /* 
8e10: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
8e20: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
8e30: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
8e40: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
8e50: 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f     ** if SQLITE_
8e60: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
8e70: 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65  CELL_CHECK is de
8e80: 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20  fined .    */.  
8e90: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
8ea0: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
8eb0: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
8ec0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8ed0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
8ee0: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
8ef0: 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc>=iCellFirst
8f00: 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73   && pc<=iCellLas
8f10: 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  t );.    size = 
8f20: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
8f30: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
8f40: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
8f50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8f60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8f70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8f80: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8f90: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
8fa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8fb0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8fc0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
8fd0: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8fe0: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
8ff0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
9000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9010: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9020: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
9030: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
9040: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
9050: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
9060: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9070: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
9080: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
9090: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
90a0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
90b0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
90c0: 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c  brk], &temp[pc],
90d0: 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32   size);.    put2
90e0: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
90f0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
9100: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
9110: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
9120: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
9130: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
9140: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
9150: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
9160: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
9170: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
9180: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
9190: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
91a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
91b0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
91c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
91d0: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
91e0: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
91f0: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
9200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9210: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
9220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9230: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
9240: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
9250: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
9260: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
9270: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
9280: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
9290: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
92a0: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
92b0: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
92c0: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
92d0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
92e0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
92f0: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
9300: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
9310: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
9320: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
9330: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
9340: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
9350: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
9360: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
9370: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
9380: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
9390: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
93a0: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
93b0: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
93c0: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
93d0: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
93e0: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
93f0: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
9400: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
9410: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
9420: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
9430: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
9440: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
9450: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
9460: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
9470: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
9480: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
9490: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
94a0: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
94b0: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
94c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
94d0: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
94e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
94f0: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
9500: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
9510: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9520: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
9530: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
9540: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
9550: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
9560: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9570: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
9580: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
9590: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  aData */.  int n
95a0: 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Frag;           
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61  /* Number of fra
95d0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e  gmented bytes on
95e0: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
95f0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
9620: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
9630: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  rea */.  int gap
9640: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
9650: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
9660: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
9670: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
9680: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tent */.  int rc
9690: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
96a0: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
96b0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
96c0: 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
96d0: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
96e0: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
96f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
9700: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
9710: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
9720: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9740: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9750: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9760: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9770: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
9780: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
9790: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
97a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
97b0: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
97c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
97d0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75  erflow==0 );.  u
97e0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
97f0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9800: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42  ze;.  assert( nB
9810: 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65  yte < usableSize
9820: 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  -8 );..  nFrag =
9830: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
9840: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9850: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9860: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9870: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9880: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9890: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
98a0: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
98b0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
98c0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
98d0: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
98e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
98f0: 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61  T_BKPT;.  testca
9900: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
9910: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
9920: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
9930: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
9940: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67   );..  if( nFrag
9950: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  >=60 ){.    /* A
9960: 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74  lways defragment
9970: 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74   highly fragment
9980: 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ed pages */.    
9990: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
99a0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
99b0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
99c0: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
99d0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
99e0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d  ata[hdr+5]);.  }
99f0: 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c 3d  else if( gap+2<=
9a00: 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  top ){.    /* Se
9a10: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
9a20: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
9a30: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
9a40: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
9a50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75  .    ** the requ
9a60: 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74  est. The allocat
9a70: 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d  ion is made from
9a80: 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
9a90: 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20  slot in .    ** 
9aa0: 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
9ab0: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
9ac0: 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a   accomadate it..
9ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70      */.    int p
9ae0: 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72  c, addr;.    for
9af0: 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63  (addr=hdr+1; (pc
9b00: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9b10: 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64  a[addr]))>0; add
9b20: 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74  r=pc){.      int
9b30: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
9b40: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
9b50: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
9b60: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
9b70: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64  eSize-4 || pc<ad
9b80: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  dr+4 ){.        
9b90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9ba0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9bb0: 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d    }.      size =
9bc0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9bd0: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
9be0: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
9bf0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
9c00: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
9c10: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9c20: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20   x==4 );.       
9c30: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
9c40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
9c50: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
9c60: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
9c70: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
9c80: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
9c90: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
9ca0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
9cb0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
9cc0: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
9cd0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
9ce0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
9cf0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
9d00: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
9d10: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
9d20: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
9d30: 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20  e if( size+pc > 
9d40: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
9d50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9d60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9d70: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
9d80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
9d90: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
9da0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
9db0: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
9dc0: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
9dd0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
9de0: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
9df0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
9e00: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
9e10: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
9e20: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
9e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e40: 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a  *pIdx = pc + x;.
9e50: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9e60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
9e70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
9e80: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
9e90: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e  sure there is en
9ea0: 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68  ough space in th
9eb0: 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79  e gap to satisfy
9ec0: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61  .  ** the alloca
9ed0: 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64  tion.  If not, d
9ee0: 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  efragment..  */.
9ef0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
9f00: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
9f10: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
9f20: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20  e>top ){.    rc 
9f30: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
9f40: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
9f50: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9f60: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
9f70: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
9f80: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
9f90: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
9fa0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
9fb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
9fc0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
9fd0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
9fe0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9ff0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
a000: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a010: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
a020: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
a030: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
a040: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
a050: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
a060: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
a070: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
a080: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
a090: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
a0a0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
a0b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
a0c0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
a0d0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
a0e0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
a0f0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
a100: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
a110: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a120: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a130: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
a140: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
a150: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a160: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
a170: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
a180: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a190: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
a1a0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
a1b0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
a1c0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
a1d0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a1e0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
a1f0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
a200: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
a210: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
a220: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
a230: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
a240: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
a250: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
a260: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
a270: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
a280: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
a290: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
a2a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a2b0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
a2c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73  ge *pPage, int s
a2d0: 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b  tart, int size){
a2e0: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65  .  int addr, pbe
a2f0: 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20  gin, hdr;.  int 
a300: 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  iLast;          
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a320: 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   Largest possibl
a330: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  e freeblock offs
a340: 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  et */.  unsigned
a350: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
a360: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
a370: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
a380: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
a390: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
a3a0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
a3b0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
a3c0: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
a3d0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
a3e0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
a3f0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
a400: 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29  ( (start + size)
a410: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
a420: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a440: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a450: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
a460: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
a470: 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20  size>=0 );   /* 
a480: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
a490: 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66 28  e is 4 */..  if(
a4a0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 73 65 63   pPage->pBt->sec
a4b0: 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ureDelete ){.   
a4c0: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
a4d0: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
a4e0: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
a4f0: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
a500: 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f  ete.    ** optio
a510: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
a520: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
a530: 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65  [start], 0, size
a540: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  );.  }..  /* Add
a550: 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20   the space back 
a560: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
a570: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
a580: 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  ks.  Note that. 
a590: 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20   ** even though 
a5a0: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
a5b0: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
a5c0: 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  y btreeInitPage(
a5d0: 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69  ),.  ** btreeIni
a5e0: 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20  tPage() did not 
a5f0: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69  detect overlappi
a600: 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a  ng cells or.  **
a610: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
a620: 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c   overlapped cell
a630: 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  s.   Nor does it
a640: 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65   detect when the
a650: 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65  .  ** cell conte
a660: 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20  nt area exceeds 
a670: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
a680: 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49   page header.  I
a690: 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74  f these.  ** sit
a6a0: 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74  uations arise, t
a6b0: 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69  hen subsequent i
a6c0: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
a6d0: 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20   might corrupt. 
a6e0: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
a6f0: 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64  .  So we do need
a700: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f   to check for co
a710: 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73  rruption while s
a720: 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65  canning.  ** the
a730: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
a740: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
a750: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
a760: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c   = hdr + 1;.  iL
a770: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
a780: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
a790: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
a7a0: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68  t<=iLast );.  wh
a7b0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
a7c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a7d0: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
a7e0: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69  begin>0 ){.    i
a7f0: 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34  f( pbegin<addr+4
a800: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a810: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a820: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
a830: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
a840: 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e   }.  if( pbegin>
a850: 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74  iLast ){.    ret
a860: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a870: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
a880: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
a890: 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20  dr || pbegin==0 
a8a0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
a8b0: 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74  ata[addr], start
a8c0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
a8d0: 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67  ata[start], pbeg
a8e0: 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  in);.  put2byte(
a8f0: 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20  &data[start+2], 
a900: 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  size);.  pPage->
a910: 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e  nFree = pPage->n
a920: 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65  Free + (u16)size
a930: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
a940: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
a950: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
a960: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
a970: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
a980: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a990: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
a9a0: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20  t pnext, psize, 
a9b0: 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
a9c0: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
a9d0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
a9e0: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
a9f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
aa00: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
aa10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa20: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
aa30: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
aa40: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
aa50: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
aa60: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
aa70: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
aa80: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
aa90: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
aaa0: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
aab0: 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c    if( (frag<0) |
aac0: 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74  | (frag>(int)dat
aad0: 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20  a[hdr+7]) ){.   
aae0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aaf0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ab00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
ab10: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75  ata[hdr+7] -= (u
ab20: 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20  8)frag;.      x 
ab30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ab40: 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20  [pnext]);.      
ab50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
ab60: 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20  begin], x);.    
ab70: 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65    x = pnext + ge
ab80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
ab90: 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b  xt+2]) - pbegin;
aba0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
abb0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c  &data[pbegin+2],
abc0: 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   x);.    }else{.
abd0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65        addr = pbe
abe0: 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  gin;.    }.  }..
abf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
ac00: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65   content area be
ac10: 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65  gins with a free
ac20: 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74  block, remove it
ac30: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b  . */.  if( data[
ac40: 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+1]==data[hdr
ac50: 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b  +5] && data[hdr+
ac60: 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20  2]==data[hdr+6] 
ac70: 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a  ){.    int top;.
ac80: 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74      pbegin = get
ac90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
aca0: 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1]);.    memcpy(
acb0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64  &data[hdr+1], &d
acc0: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b  ata[pbegin], 2);
acd0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
ace0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
acf0: 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  ) + get2byte(&da
ad00: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
ad10: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
ad20: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
ad30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
ad40: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ad50: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ad60: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
ad70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ad80: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
ad90: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
ada0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
adb0: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
adc0: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
add0: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
ade0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
adf0: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
ae00: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
ae10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
ae20: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
ae30: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
ae40: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
ae50: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
ae60: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
ae70: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
ae80: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
ae90: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
aea0: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
aeb0: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
aec0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
aed0: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
aee0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
aef0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
af00: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
af10: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
af20: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
af30: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
af40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
af50: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
af60: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
af70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
af80: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
af90: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
afa0: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
afb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
afc0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
afd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
afe0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
aff0: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
b000: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
b010: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
b020: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
b030: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
b040: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
b050: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
b060: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
b070: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
b080: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
b090: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
b0a0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
b0b0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
b0c0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
b0d0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
b0e0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b0f0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
b100: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
b110: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
b120: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
b130: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
b140: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
b150: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
b160: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
b170: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
b180: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
b190: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
b1a0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
b1b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
b1c0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
b1d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b1e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b1f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b200: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
b210: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
b220: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
b230: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
b240: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
b250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
b260: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
b270: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b280: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
b290: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
b2a0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
b2b0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
b2c0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
b2d0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
b2e0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
b2f0: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
b300: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
b310: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
b320: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
b330: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
b340: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
b350: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
b360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b370: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  btreeInitPage(Me
b380: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
b390: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b3a0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
b3b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b3c0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b3d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b3e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
b3f0: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
b400: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
b410: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b420: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
b430: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
b440: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
b450: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b460: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
b470: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b480: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
b490: 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66  DbPage) );..  if
b4a0: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
b4b0: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20   ){.    u16 pc; 
b4c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
b4d0: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
b4e0: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
b4f0: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
b500: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
b510: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
b520: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
b530: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
b540: 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
b550: 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
b560: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
b570: 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
b580: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
b590: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
b5a0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e  ucture */.    in
b5b0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
b5c0: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
b5d0: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
b5e0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75  ch page */.    u
b5f0: 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  16 cellOffset;  
b600: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
b610: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
b620: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
b630: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
b640: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
b650: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
b660: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
b670: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  page */.    int 
b680: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
b690: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
b6a0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b6b0: 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74   area */.    int
b6c0: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b6d0: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b6e0: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
b6f0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
b700: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74     int iCellLast
b710: 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  ;     /* Last po
b720: 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  ssible cell or f
b730: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
b740: 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50  */..    pBt = pP
b750: 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68  age->pBt;..    h
b760: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b770: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
b780: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b790: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
b7a0: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
b7b0: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
b7c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b7d0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
b7e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
b7f0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
b800: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
b810: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
b820: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
b830: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
b840: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
b850: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
b860: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
b870: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
b880: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
b890: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
b8a0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
b8b0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70  e->leaf;.    top
b8c0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
b8d0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
b8e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
b8f0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
b900: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
b910: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
b920: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
b930: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
b940: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
b950: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
b960: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
b970: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
b980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b990: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
b9a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b9b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
b9c0: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20  CELL(pBt) );..  
b9d0: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
b9e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
b9f0: 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
ba00: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
ba10: 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67  nd.    ** of pag
ba20: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
ba30: 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a   cell.  .    **.
ba40: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
ba50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
ba60: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
ba70: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
ba80: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20   extends.    ** 
ba90: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
baa0: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
bab0: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
bac0: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
bad0: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  .    ** returned
bae0: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20   if it does..   
baf0: 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72   */.    iCellFir
bb00: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
bb10: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
bb20: 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20  ;.    iCellLast 
bb30: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
bb40: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
bb50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
bb60: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
bb70: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
bb80: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
bb90: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
bba0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
bbb0: 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ray */.      int
bbc0: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
bbd0: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
bbe0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
bbf0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
bc00: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20  ellLast--;.     
bc10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
bc20: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
bc30: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
bc40: 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
bc50: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
bc60: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bc70: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
bc80: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bc90: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
bca0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
bcb0: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
bcc0: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
bcd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
bce0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bcf0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bd00: 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63  }.        sz = c
bd10: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
bd20: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
bd30: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd40: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
bd50: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
bd60: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
bd70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
bd80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bd90: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
bda0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bdb0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
bdc0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
bdd0: 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69  +;.    }  .#endi
bde0: 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  f..    /* Comput
bdf0: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
be00: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
be10: 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  ge */.    pc = g
be20: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
be30: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
be40: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
be50: 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28   top;.    while(
be60: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
be70: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
be80: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
be90: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
bea0: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
beb0: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72    /* Start of fr
bec0: 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20  ee block is off 
bed0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
bee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bef0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
bf00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
bf10: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
bf20: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
bf30: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
bf40: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
bf50: 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30       if( (next>0
bf60: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
bf70: 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  e+3) || pc+size>
bf80: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
bf90: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
bfa0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
bfb0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
bfc0: 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79   And the last by
bfd0: 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72  te of..** the fr
bfe0: 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69  ee-block must li
bff0: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
c000: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
c010: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c020: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c040: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
c050: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
c060: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
c070: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
c080: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
c090: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
c0a0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c0b0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
c0c0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c0d0: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
c0e0: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
c0f0: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
c100: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c110: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
c120: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c130: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
c140: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
c150: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
c160: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c170: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
c180: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
c190: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
c1a0: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
c1b0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c1c0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
c1d0: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
c1e0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
c1f0: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
c200: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
c210: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
c220: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
c230: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c240: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c250: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
c260: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c270: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
c280: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
c290: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c2a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c2b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c2c0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c2d0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c2e0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c2f0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c300: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c310: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c320: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c330: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c340: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c350: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c360: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c370: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c380: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
c390: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c3a0: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
c3b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c3c0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
c3d0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
c3e0: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
c3f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c400: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
c410: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
c420: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
c430: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
c440: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c450: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c460: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
c470: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c480: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
c490: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c4a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c4b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c4c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
c4d0: 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72    if( pBt->secur
c4e0: 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d  eDelete ){.    m
c4f0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
c500: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
c510: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
c520: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
c530: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
c540: 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  rst = hdr + 8 + 
c550: 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  4*((flags&PTF_LE
c560: 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20  AF)==0 ?1:0);.  
c570: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
c580: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
c590: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
c5a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c5b0: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
c5c0: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
c5d0: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c5e0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
c5f0: 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
c600: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
c610: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
c620: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
c630: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
c640: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
c650: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
c660: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
c670: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
c680: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
c690: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
c6a0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
c6b0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
c6c0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
c6d0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
c6e0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
c6f0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
c700: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
c710: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
c720: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
c730: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
c740: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
c750: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
c760: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
c770: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
c780: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
c790: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
c7a0: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
c7b0: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
c7c0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
c7d0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
c7e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
c7f0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
c800: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
c810: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
c820: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
c830: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
c840: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
c850: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
c860: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
c870: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
c880: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
c890: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
c8a0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
c8b0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
c8c0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
c8d0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
c8e0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
c8f0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
c900: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
c910: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
c920: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
c930: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
c940: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
c950: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
c960: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
c970: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
c980: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
c990: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
c9a0: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
c9b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
c9c0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
c9d0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
c9e0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
c9f0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
ca00: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
ca10: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
ca20: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
ca30: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
ca40: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
ca50: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
ca60: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
ca70: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
ca80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ca90: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
caa0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
cab0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
cac0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
cad0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cae0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
caf0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
cb00: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
cb10: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
cb20: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
cb30: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
cb40: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
cb50: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
cb60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
cb70: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
cb80: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
cb90: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
cba0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cbb0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cbc0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
cbd0: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
cbe0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
cbf0: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
cc00: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
cc10: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
cc20: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
cc30: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
cc40: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
cc50: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
cc60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cc70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
cc80: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
cc90: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
cca0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
ccb0: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
ccc0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
ccd0: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
cce0: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
ccf0: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
cd00: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
cd10: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
cd20: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
cd30: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
cd40: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
cd50: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
cd60: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
cd70: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
cd80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
cd90: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
cda0: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
cdb0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
cdc0: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
cdd0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
cde0: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
cdf0: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
ce00: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
ce10: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
ce20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ce30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ce40: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
ce50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
ce60: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
ce70: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
ce80: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
ce90: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
cea0: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
ceb0: 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
cec0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
ced0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
cee0: 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
cef0: 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
cf00: 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
cf10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
cf20: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
cf30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
cf40: 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
cf50: 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
cf60: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62  .  return (int)b
cf70: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
cf80: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
cf90: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
cfa0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
cfb0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
cfc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
cfd0: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
cfe0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
cff0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
d000: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
d010: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
d020: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
d030: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d040: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
d050: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
d060: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
d070: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
d080: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
d090: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
d0a0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
d0b0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
d0c0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
d0d0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
d0e0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
d0f0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d100: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d110: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
d120: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
d130: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
d140: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
d150: 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e     /* Write t
d160: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
d170: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
d180: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
d190: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d1a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d1b0: 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
d1c0: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
d1d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
d1e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d1f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d200: 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
d210: 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
d220: 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
d230: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d240: 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
d250: 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
d260: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
d270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d280: 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
d290: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
d2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d2b0: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
d2c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
d2d0: 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
d2e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
d2f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d300: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
d310: 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
d320: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
d330: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
d340: 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
d350: 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
d360: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
d370: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
d380: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
d390: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73   pPage ){.    as
d3a0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
d3b0: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
d3c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
d3d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d3e0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
d3f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d400: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
d410: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d420: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
d430: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
d440: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
d450: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d460: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d470: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d480: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
d490: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
d4a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
d4b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  .  }.}../*.** Du
d4c0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
d4d0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
d4e0: 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
d4f0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
d500: 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
d510: 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
d520: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
d530: 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
d540: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
d550: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
d560: 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
d570: 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
d580: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
d590: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d5a0: 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
d5b0: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
d5c0: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
d5d0: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
d5e0: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
d5f0: 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
d600: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d610: 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
d620: 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
d630: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
d640: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
d650: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
d660: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
d670: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d680: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
d690: 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
d6a0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
d6b0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
d6c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d6d0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d6e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
d6f0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
d700: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
d710: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
d720: 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
d730: 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
d740: 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
d750: 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
d760: 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
d770: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
d780: 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
d790: 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
d7a0: 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
d7b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
d7c0: 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
d7d0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
d7e0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
d7f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
d800: 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
d810: 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
d820: 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
d830: 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
d840: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
d850: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
d860: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
d870: 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
d880: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
d890: 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
d8a0: 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
d8b0: 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
d8c0: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
d8d0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
d8e0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
d8f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
d900: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
d910: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
d920: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
d930: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
d940: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
d950: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d960: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
d970: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
d980: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
d990: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d9a0: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
d9b0: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
d9c0: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
d9d0: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
d9e0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
d9f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
da00: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
da10: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
da20: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
da30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
da40: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
da50: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
da60: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
da70: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
da80: 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
da90: 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
daa0: 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
dab0: 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
dac0: 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
dad0: 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
dae0: 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
daf0: 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
db00: 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
db10: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
db20: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
db30: 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
db40: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
db50: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
db60: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
db70: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
db80: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
db90: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
dba0: 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
dbb0: 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
dbc0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
dbd0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
dbe0: 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
dbf0: 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
dc00: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
dc10: 69 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  its.** BTREE_OMI
dc20: 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
dc30: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
dc40: 43 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e  CK.  The BTREE_N
dc50: 4f 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69  O_READLOCK.** bi
dc60: 74 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66  t is also set if
dc70: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65   the SQLITE_NoRe
dc80: 61 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20  adlock flags is 
dc90: 73 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73  set in db->flags
dca0: 2e 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73  ..** These flags
dcb0: 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f   are passed thro
dcc0: 75 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33  ugh into sqlite3
dcd0: 50 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20  PagerOpen() and 
dce0: 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73  must.** be the s
dcf0: 61 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41  ame values as PA
dd00: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
dd10: 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45   and PAGER_NO_RE
dd20: 41 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ADLOCK..**.** If
dd30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
dd40: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
dd50: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
dd60: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
dd70: 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e  ** and we are in
dd80: 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f   shared cache mo
dd90: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65  de, then the ope
dda0: 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  n will fail with
ddb0: 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
ddc0: 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20  NSTRAINT error. 
ddd0: 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   We cannot allow
dde0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53   two or more BtS
ddf0: 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73  hared.** objects
de00: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
de10: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
de20: 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
de30: 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20  will lead.** to 
de40: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f  problems with lo
de50: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
de60: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
de70: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
de80: 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53  Vfs,      /* VFS
de90: 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73   to use for this
dea0: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e   b-tree */.  con
deb0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
dec0: 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
ded0: 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  the file contain
dee0: 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61  ing the BTree da
def0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
df00: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
df10: 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65      /* Associate
df20: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
df30: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70  e */.  Btree **p
df40: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f  pBtree,        /
df50: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
df60: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
df70: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20  itten here */.  
df80: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
df90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f          /* Optio
dfa0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  ns */.  int vfsF
dfb0: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
dfc0: 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
dfd0: 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
dfe0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
dff0: 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
e000: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
e010: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
e020: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
e030: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
e040: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
e050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e060: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
e070: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
e080: 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
e090: 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
e0a0: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
e0b0: 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
e0c0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e0d0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e0e0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
e0f0: 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
e100: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
e110: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
e120: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e130: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e140: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
e150: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
e160: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
e170: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
e180: 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
e190: 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70  .  /* True if op
e1a0: 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72  ening an ephemer
e1b0: 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61  al, temporary da
e1c0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
e1d0: 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d  t int isTempDb =
e1e0: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
e1f0: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30   zFilename[0]==0
e200: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
e210: 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62  variable isMemdb
e220: 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20   to true for an 
e230: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
e240: 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c  se, or .  ** fal
e250: 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61  se for a file-ba
e260: 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20  sed database..  
e270: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
e280: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
e290: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
e2a0: 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20  db = 0;.#else.  
e2b0: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
e2c0: 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26  b = (zFilename &
e2d0: 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  & strcmp(zFilena
e2e0: 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  me, ":memory:")=
e2f0: 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =0).            
e300: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69             || (i
e310: 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74  sTempDb && sqlit
e320: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
e330: 62 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  b));.#endif..  a
e340: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
e350: 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
e360: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e370: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e380: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
e390: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e3a0: 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
e3b0: 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
e3c0: 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
e3d0: 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
e3e0: 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
e3f0: 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
e400: 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
e410: 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
e420: 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
e430: 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
e440: 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
e450: 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
e460: 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
e470: 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
e480: 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
e490: 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
e4a0: 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
e4b0: 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
e4c0: 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
e4d0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  f( db->flags & S
e4e0: 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b  QLITE_NoReadlock
e4f0: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
e500: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
e510: 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  CK;.  }.  if( is
e520: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
e530: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
e540: 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
e550: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e560: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
e570: 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
e580: 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
e590: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
e5a0: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
e5b0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
e5c0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
e5d0: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
e5e0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e5f0: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
e600: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e620: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
e630: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
e640: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
e650: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
e660: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e670: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
e680: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
e690: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
e6a0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
e6b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e6c0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e6d0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e6e0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e6f0: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
e700: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
e710: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
e720: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
e730: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
e740: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
e750: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
e760: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
e770: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
e780: 3d 30 20 26 26 20 69 73 54 65 6d 70 44 62 3d 3d  =0 && isTempDb==
e790: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  0 ){.    if( vfs
e7a0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
e7b0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
e7c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
e7d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
e7e0: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
e7f0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
e800: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e810: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
e820: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e830: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
e840: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
e850: 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
e860: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
e870: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
e880: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
e890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e8a0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
e8b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e8c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
e8d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e8e0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
e8f0: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
e900: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
e910: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e920: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e930: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
e940: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
e950: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
e970: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
e980: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
e990: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
e9a0: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
e9b0: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
e9c0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e9d0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
e9e0: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
e9f0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ea00: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
ea10: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
ea20: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
ea30: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
ea40: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
ea50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ea60: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ea70: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
ea80: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
ea90: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
eaa0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
eab0: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
eac0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
ead0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
eae0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
eaf0: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
eb00: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
eb10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
eb20: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
eb30: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
eb40: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
eb50: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
eb60: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
eb70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
eb80: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
eb90: 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
eba0: 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
ebb0: 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
ebc0: 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
ebd0: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
ebe0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
ebf0: 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
ec00: 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
ec10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ec20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ec30: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
ec40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ec50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ec60: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
ec70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ec80: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
ec90: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
eca0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ecb0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
ecc0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ecd0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ece0: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
ecf0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ed00: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
ed10: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
ed20: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
ed30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ed40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ed50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ed60: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
ed70: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
ed80: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
ed90: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
eda0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
edb0: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
edc0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
edd0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
ede0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
edf0: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
ee00: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
ee10: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
ee20: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
ee30: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
ee40: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
ee50: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
ee60: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
ee70: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
ee80: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
ee90: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
eea0: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
eeb0: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
eec0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
eed0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
eee0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
eef0: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
ef00: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
ef10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
ef20: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
ef30: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
ef40: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
ef50: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
ef60: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
ef70: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
ef80: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
ef90: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
efa0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
efb0: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
efc0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
efd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
efe0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
eff0: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
f000: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f010: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
f020: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
f030: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f040: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
f050: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f060: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
f070: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
f080: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
f090: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
f0a0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
f0b0: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
f0c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
f0d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
f0e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f0f0: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f100: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f110: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f120: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
f130: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
f140: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
f170: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
f180: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
f190: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f1a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
f1b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
f1c0: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
f1d0: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
f1e0: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
f1f0: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
f200: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f210: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
f220: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
f230: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
f240: 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
f250: 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
f260: 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
f270: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
f280: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
f290: 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
f2a0: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
f2b0: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
f2c0: 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
f2d0: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
f2e0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
f2f0: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
f300: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
f310: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
f320: 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66 64 65  ->pPager);.#ifde
f330: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
f340: 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
f350: 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d 20 31  secureDelete = 1
f360: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74  ;.#endif.    pBt
f370: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
f380: 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
f390: 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
f3a0: 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
f3b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
f3c0: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
f3d0: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
f3e0: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
f3f0: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
f400: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
f410: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
f420: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f430: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
f440: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f450: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
f460: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
f470: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
f480: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
f490: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
f4a0: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
f4b0: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
f4c0: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
f4d0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
f4e0: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
f4f0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
f500: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
f510: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
f520: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
f530: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
f540: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
f550: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
f560: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
f570: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
f580: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
f590: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
f5a0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
f5b0: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
f5c0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
f5d0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
f5e0: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
f5f0: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
f600: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
f610: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f620: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
f630: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
f640: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
f650: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
f660: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
f670: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
f680: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
f690: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
f6a0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
f6b0: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
f6c0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f6d0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
f6e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f6f0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
f700: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f710: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f720: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
f730: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
f740: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
f750: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
f760: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
f770: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
f780: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f790: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
f7a0: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
f7b0: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
f7c0: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
f7d0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
f7e0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
f7f0: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
f800: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
f810: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
f820: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
f830: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
f840: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
f850: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
f860: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
f870: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f880: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
f890: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
f8a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
f8b0: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
f8c0: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
f8d0: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
f8e0: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
f8f0: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
f900: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
f910: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
f920: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
f930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
f940: 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
f950: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
f960: 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
f970: 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
f980: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
f990: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
f9a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
f9b0: 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
f9c0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
f9d0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
f9e0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
f9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
fa00: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
fa10: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fa20: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
fa30: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
fa40: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
fa50: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fa60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
fa70: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
fa80: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
fa90: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
faa0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
fab0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fad0: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
fae0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
faf0: 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
fb00: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fb10: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
fb20: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
fb30: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fb40: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
fb50: 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
fb60: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
fb70: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
fb80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
fb90: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
fba0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
fbb0: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
fbc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
fbd0: 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
fbe0: 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
fbf0: 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
fc00: 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
fc10: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
fc20: 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
fc30: 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
fc40: 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
fc50: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
fc60: 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
fc70: 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
fc80: 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
fc90: 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
fca0: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
fcb0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
fcc0: 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
fcd0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fce0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
fcf0: 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
fd00: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
fd10: 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
fd20: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
fd30: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
fd40: 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
fd50: 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
fd60: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
fd70: 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
fd80: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
fd90: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
fda0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
fdb0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
fdc0: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
fdd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fde0: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
fdf0: 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
fe00: 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
fe10: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
fe20: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
fe30: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
fe40: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
fe50: 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
fe60: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
fe70: 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
fe80: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
fe90: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
fea0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
feb0: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
fec0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
fed0: 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
fee0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fef0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ff00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
ff10: 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
ff20: 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
ff30: 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
ff40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
ff50: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
ff60: 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
ff70: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
ff80: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
ff90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ffa0: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
ffb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
ffc0: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
ffd0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ffe0: 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
fff0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
10000 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
10010 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
10020 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
10030 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
10040 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
10050 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
10060 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
10070 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
10080 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
10090 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
100a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
100b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
100c0 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
100d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
100e0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
100f0 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
10100 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
10110 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
10120 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
10130 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
10140 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10150 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
10160 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
10170 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10180 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
10190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
101a0 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
101b0 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
101c0 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
101d0 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
101e0 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
101f0 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
10200 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
10210 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
10220 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
10230 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
10240 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
10250 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
10260 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
10270 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
10280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
10290 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
102a0 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
102b0 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
102c0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
102d0 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
102e0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
102f0 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
10300 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
10310 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
10320 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
10330 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
10340 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
10350 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
10360 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
10370 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10380 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10390 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
103a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
103b0 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
103c0 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
103d0 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
103e0 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
103f0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10400 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10410 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
10420 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
10430 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10440 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
10450 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
10460 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
10470 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
10480 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10490 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
104a0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
104b0 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
104c0 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
104d0 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
104e0 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
104f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10500 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10510 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10520 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10540 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10550 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
10560 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10570 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
10580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
10590 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
105a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
105b0 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
105c0 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
105d0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
105e0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
105f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10600 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10610 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10620 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10630 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
10640 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10650 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
10660 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
10670 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
10680 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
10690 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
106a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
106b0 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
106c0 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
106d0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
106e0 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
106f0 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10700 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10710 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10720 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10730 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
10740 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
10750 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
10760 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
10770 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
10780 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
10790 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
107a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
107b0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
107c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
107d0 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
107e0 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
107f0 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10800 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10810 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10820 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10830 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
10840 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
10850 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10860 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
10870 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
10880 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
10890 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
108a0 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
108b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
108c0 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
108d0 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
108e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
108f0 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10900 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10910 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10920 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10930 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10940 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
10950 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
10960 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10970 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
10980 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
10990 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
109a0 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
109b0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
109c0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
109d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
109e0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
109f0 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
10a00 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
10a10 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
10a20 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
10a30 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
10a40 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
10a50 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
10a60 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
10a70 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
10a80 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
10a90 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10aa0 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
10ab0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
10ac0 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
10ad0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10ae0 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10af0 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
10b00 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
10b10 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
10b20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
10b30 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
10b40 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
10b50 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
10b60 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
10b70 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
10b80 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10b90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10ba0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10bb0 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10bc0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10bd0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10be0 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10bf0 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
10c00 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
10c10 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
10c20 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
10c30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
10c40 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
10c50 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
10c60 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10c70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10c80 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
10c90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10ca0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
10cb0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10cc0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
10cd0 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
10ce0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
10cf0 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
10d00 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10d10 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10d20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10d30 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
10d40 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
10d50 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
10d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10d70 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10d80 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
10d90 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
10da0 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
10db0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
10dc0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10dd0 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
10de0 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
10df0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
10e00 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
10e10 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10e20 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
10e30 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
10e40 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
10e50 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
10e60 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
10e70 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
10e80 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
10e90 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
10ea0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
10eb0 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
10ec0 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
10ed0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
10ee0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
10ef0 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
10f00 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
10f10 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
10f20 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
10f30 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
10f40 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
10f50 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
10f60 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
10f70 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
10f80 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
10f90 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
10fa0 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
10fb0 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
10fc0 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
10fd0 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
10fe0 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
10ff0 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
11000 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
11010 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
11020 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
11030 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
11040 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
11050 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
11060 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11070 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11090 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
110a0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
110b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
110c0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
110d0 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
110e0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
110f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11100 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11110 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11120 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11130 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
11140 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
11150 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
11160 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
11170 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
11180 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
11190 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
111a0 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
111b0 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
111c0 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
111d0 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
111e0 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
111f0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11200 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11210 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11220 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11230 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
11240 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
11250 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
11260 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11270 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
11280 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
11290 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
112a0 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
112b0 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
112c0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
112d0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
112e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
112f0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11300 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11310 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42  SafetyLevel(.  B
11320 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
11330 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11340 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
11350 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
11360 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20  .  int level,   
11370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
11380 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
11390 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
113a0 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69  L, 3=FULL */.  i
113b0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20  nt fullSync,    
113c0 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
113d0 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20  fullfsync. */.  
113e0 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63  int ckptFullSync
113f0 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11400 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
11410 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  fync */.){.  BtS
11420 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11430 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11440 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11450 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  );.  assert( lev
11470 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
11480 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  3 );.  sqlite3Bt
11490 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
114a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
114b0 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
114c0 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
114d0 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c  llSync, ckptFull
114e0 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
114f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11510 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
11520 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11530 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
11540 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
11550 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
11560 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
11570 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
11580 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
11590 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
115a0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
115b0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
115c0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
115d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
115e0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
115f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11600 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11610 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
11620 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
11630 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
11640 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
11650 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
11660 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
11670 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
11680 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11690 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
116a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
116b0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
116c0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
116d0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
116e0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
116f0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
11700 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
11710 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11720 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
11730 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
11740 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
11750 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
11760 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
11770 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
11780 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
11790 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
117a0 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
117b0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
117c0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
117d0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
117e0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
117f0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
11800 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
11810 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
11820 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
11830 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
11840 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
11850 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11860 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
11870 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
11880 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
11890 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
118a0 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
118b0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
118c0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
118d0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
118e0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
118f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
11900 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
11910 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
11920 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
11930 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
11940 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
11950 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
11960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
11970 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
11980 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c  pageSizeFixed fl
11990 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
119a0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
119b0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
119c0 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
119d0 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
119e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
119f0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
11a00 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
11a10 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
11a20 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
11a30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11a40 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
11a50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11a60 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11a70 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
11a80 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
11a90 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11aa0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
11ab0 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
11ac0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11ad0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
11ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11af0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
11b00 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
11b10 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
11b20 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
11b30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
11b40 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
11b50 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
11b60 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
11b70 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
11b80 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
11b90 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
11ba0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
11bb0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11bc0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
11bd0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
11be0 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
11bf0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
11c00 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
11c10 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
11c20 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
11c30 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
11c40 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
11c50 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
11c60 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
11c70 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
11c80 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11c90 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
11ca0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11cb0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11cc0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
11cd0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
11ce0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11cf0 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
11d00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11d20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11d30 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
11d40 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
11d50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11d60 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
11d70 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
11d80 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
11d90 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
11da0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
11db0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
11dc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11dd0 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
11de0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
11df0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
11e00 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
11e10 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
11e20 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
11e30 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
11e40 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11e50 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
11e60 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
11e70 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
11e80 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
11e90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11ea0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
11eb0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
11ec0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11ed0 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
11ee0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
11ef0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
11f00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11f10 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11f20 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
11f30 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
11f40 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
11f50 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
11f60 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
11f70 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
11f80 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
11f90 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
11fa0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
11fb0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
11fc0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
11fd0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
11fe0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
11ff0 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
12000 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
12010 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12020 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12030 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12040 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
12050 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
12060 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
12070 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
12080 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12090 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
120a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
120b0 75 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69  ureDelete flag i
120c0 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
120d0 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
120e0 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
120f0 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
12100 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
12110 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12120 20 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a   secureDelete.**
12130 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
12140 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
12150 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12160 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
12170 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
12180 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
12190 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
121a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
121b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
121c0 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
121d0 20 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72     p->pBt->secur
121e0 65 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c  eDelete = (newFl
121f0 61 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a  ag!=0) ? 1 : 0;.
12200 20 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42    } .  b = p->pB
12210 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b  t->secureDelete;
12220 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12230 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12240 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n b;.}.#endif /*
12250 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12260 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
12270 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
12280 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
12290 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
122a0 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
122b0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
122c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
122d0 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
122e0 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
122f0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
12300 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
12310 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
12320 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
12330 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
12340 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
12350 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
12360 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
12370 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
12380 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
12390 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
123a0 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
123b0 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
123c0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
123d0 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
123e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
123f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12400 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12410 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
12420 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12430 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
12440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12450 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
12460 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
12470 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12480 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
12490 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20  ageSizeFixed && 
124a0 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
124b0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
124c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
124d0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
124e0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
124f0 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
12500 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
12510 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
12520 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12530 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12540 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
12550 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
12560 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
12570 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
12580 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
12590 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
125a0 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
125b0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
125c0 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
125d0 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
125e0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
125f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12600 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12610 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
12620 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
12630 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
12640 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12650 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
12660 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
12670 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
12680 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
12690 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
126a0 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
126b0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
126c0 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
126d0 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
126e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
126f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12700 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
12710 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
12720 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
12730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12740 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
12750 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
12760 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
12770 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
12780 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
12790 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
127a0 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
127b0 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
127c0 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
127d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
127e0 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
127f0 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
12800 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
12810 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
12820 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
12830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
12840 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
12850 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
12860 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
12870 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
12880 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
12890 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
128a0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
128b0 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
128c0 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
128d0 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
128e0 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
128f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12900 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
12910 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12920 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
12930 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
12940 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
12950 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
12960 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
12970 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
12980 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
12990 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
129a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
129b0 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
129c0 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
129d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
129e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
129f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12a00 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
12a10 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
12a20 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
12a30 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
12a40 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12a50 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12a60 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
12a70 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
12a80 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
12a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12aa0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
12ab0 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
12ac0 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
12ad0 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
12ae0 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
12af0 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
12b00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
12b10 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
12b20 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
12b30 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
12b40 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
12b50 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12b60 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12b70 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
12b80 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
12b90 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
12ba0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
12bb0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12bc0 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
12bd0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
12be0 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
12bf0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
12c00 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
12c10 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
12c20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
12c30 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
12c40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12c50 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
12c60 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
12c70 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
12c80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12c90 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12ca0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
12cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12cc0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
12cd0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
12ce0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
12cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
12d00 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
12d10 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12d20 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12d30 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
12d40 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
12d50 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12d60 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12d70 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
12d80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12d90 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12da0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12db0 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
12dc0 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
12dd0 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
12de0 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
12df0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
12e00 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
12e10 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
12e20 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
12e30 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
12e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12e50 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
12e60 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
12e70 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
12e80 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
12e90 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
12ea0 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
12eb0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
12ec0 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
12ed0 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
12ee0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
12ef0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
12f00 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
12f10 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
12f20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
12f30 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
12f40 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
12f50 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
12f60 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
12f70 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
12f80 32 20 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55  2 && pBt->doNotU
12f90 73 65 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20  seWAL==0 ){.    
12fa0 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
12fb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12fc0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
12fd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
12fe0 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
12ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13000 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13010 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13020 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
13030 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
13040 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
13050 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
13060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13070 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
13080 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13090 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
130a0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
130b0 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
130c0 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
130d0 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
130e0 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
130f0 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
13100 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13110 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
13120 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
13130 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
13140 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
13150 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
13160 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
13170 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
13180 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
13190 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
131a0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
131b0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
131c0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
131d0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
131e0 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
131f0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13200 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13210 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
13220 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
13230 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
13240 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
13250 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13260 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
13270 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
13280 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
13290 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
132a0 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
132b0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
132c0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
132d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
132e0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
132f0 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
13300 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
13310 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
13320 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
13330 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
13340 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
13350 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
13360 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
13370 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
13380 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
13390 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
133a0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
133b0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
133c0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
133d0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
133e0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
133f0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
13400 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
13410 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
13420 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
13430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
13440 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
13450 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
13460 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
13470 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
13480 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
13490 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
134a0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
134b0 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
134c0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
134d0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
134e0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
134f0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
13500 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13510 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13520 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13530 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13540 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13570 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
13580 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
13590 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
135a0 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
135b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
135c0 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
135d0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
135e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
135f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13600 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
13610 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13620 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
13630 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
13640 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
13650 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
13670 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
13680 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
13690 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
136a0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
136b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
136c0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
136d0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
136e0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
136f0 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
13700 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13710 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13720 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
13730 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
13740 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
13750 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
13760 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
13770 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
13780 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
13790 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
137a0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
137b0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
137c0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
137d0 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
137e0 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
137f0 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
13800 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
13810 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
13820 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
13830 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
13840 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
13850 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
13860 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
13870 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
13880 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
13890 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
138a0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
138b0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
138c0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
138d0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
138e0 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
138f0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
13900 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
13910 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
13920 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
13930 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
13940 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
13950 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
13960 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
13970 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
13980 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
13990 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
139a0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
139b0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
139c0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
139d0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
139e0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
139f0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
13a00 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
13a10 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
13a20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
13a30 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
13a40 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
13a50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13a60 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
13a70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
13a80 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
13a90 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
13aa0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
13ab0 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
13ac0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
13ad0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13ae0 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
13af0 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
13b00 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13b10 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13b20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
13b30 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
13b40 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
13b50 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
13b60 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
13b70 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
13b80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
13b90 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
13ba0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
13bb0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
13bc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
13bd0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
13be0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
13bf0 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
13c00 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
13c10 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
13c20 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
13c30 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
13c40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13c50 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
13c60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13c70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
13c80 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
13c90 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
13ca0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
13cb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13cc0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13ce0 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
13cf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13d00 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
13d10 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
13d20 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13d30 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
13d40 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
13d50 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
13d60 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
13d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13d80 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
13d90 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
13da0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13db0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
13dc0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
13dd0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
13de0 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
13df0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
13e00 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
13e10 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
13e20 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
13e30 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
13e40 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
13e50 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
13e60 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
13e70 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
13e80 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
13e90 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
13ea0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
13eb0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
13ec0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
13ed0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
13ee0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
13ef0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13f00 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
13f10 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
13f20 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
13f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13f40 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
13f50 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
13f60 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
13f70 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
13f80 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
13f90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
13fa0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
13fb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13fc0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
13fd0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
13fe0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
13ff0 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
14000 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
14010 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
14020 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
14030 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
14040 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
14050 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
14060 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
14070 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
14080 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
14090 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
140a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
140b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
140c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
140d0 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
140e0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
140f0 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
14100 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
14110 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
14120 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
14130 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
14140 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
14150 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
14160 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
14170 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
14180 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
14190 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
141a0 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
141b0 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
141c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
141d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
141e0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
141f0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
14200 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
14210 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
14220 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
14230 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
14240 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
14250 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
14260 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
14270 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
14280 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
14290 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
142a0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
142b0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
142c0 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
142d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
142e0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
142f0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
14300 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
14310 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
14320 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
14330 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14340 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
14350 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
14360 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
14370 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
14380 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
14390 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
143a0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
143b0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
143c0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
143d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
143e0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
143f0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
14400 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
14410 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
14420 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
14430 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
14440 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
14450 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
14460 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
14470 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
14480 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
14490 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
144a0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
144b0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
144c0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
144d0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
144e0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
144f0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
14500 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
14510 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
14520 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
14530 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
14540 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
14550 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
14560 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
14570 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
14580 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14590 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
145a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
145b0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
145c0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
145d0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
145e0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
145f0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
14600 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14610 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
14620 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
14630 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
14640 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
14650 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
14660 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
14670 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
14680 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
14690 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
146a0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
146b0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
146c0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
146d0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
146e0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
146f0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
14700 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
14710 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
14720 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
14730 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
14740 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
14750 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
14760 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
14770 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
14780 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
14790 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
147a0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
147b0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
147c0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
147d0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
147e0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
147f0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
14800 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
14810 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14820 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
14830 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
14840 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
14850 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
14860 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
14870 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
14880 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
14890 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
148a0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
148b0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
148c0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
148d0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
148e0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
148f0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
14900 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
14910 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
14920 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
14930 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
14940 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
14950 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
14960 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
14970 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
14980 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
14990 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
149a0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
149b0 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
149c0 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
149d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
149e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
149f0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
14a00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
14a10 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14a20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
14a30 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
14a40 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
14a50 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
14a60 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
14a70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
14a80 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
14a90 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
14aa0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
14ab0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
14ac0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
14ad0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
14ae0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
14af0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
14b00 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
14b10 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14b20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
14b30 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
14b40 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
14b50 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
14b60 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
14b70 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
14b80 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
14b90 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
14ba0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
14bb0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
14bc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14bd0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14be0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
14bf0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14c00 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
14c10 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
14c20 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
14c30 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
14c40 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
14c50 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
14c60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
14c70 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
14c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14c90 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
14ca0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
14cb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14cc0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
14cd0 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
14ce0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
14cf0 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
14d00 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
14d10 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
14d20 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
14d30 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
14d40 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
14d50 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
14d60 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14d70 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
14d80 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
14d90 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
14da0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
14db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14dc0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
14dd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14de0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
14df0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
14e00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14e10 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
14e20 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
14e30 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
14e40 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
14e50 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
14e60 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
14e70 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
14e80 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
14e90 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
14ea0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
14eb0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
14ec0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
14ed0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
14ee0 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
14ef0 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
14f00 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
14f10 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
14f20 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
14f30 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
14f40 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
14f50 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
14f60 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14f70 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61  ;..  pBt->initia
14f80 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28  llyEmpty = (u8)(
14f90 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a  pBt->nPage==0);.
14fa0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
14fb0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
14fc0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
14fd0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
14fe0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
14ff0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
15000 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
15010 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
15020 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
15030 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
15040 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
15050 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
15060 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
15070 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
15080 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
15090 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
150a0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
150b0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
150c0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
150d0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
150e0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
150f0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
15100 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
15110 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
15120 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
15130 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
15140 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
15150 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
15160 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
15170 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
15180 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
15190 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
151a0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
151b0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
151c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
151d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
151e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
151f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15200 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
15210 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
15220 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
15230 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
15240 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15260 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
15270 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
15280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15290 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
152a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
152b0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
152c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
152d0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
152e0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
152f0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
15300 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15310 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
15320 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
15330 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
15340 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
15350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15360 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15370 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
15380 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
15390 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
153a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
153b0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
153c0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
153d0 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d  e ){..assert( p-
153e0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
153f0 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
15400 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
15410 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
15420 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
15430 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
15440 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
15450 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
15460 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
15470 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
15480 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
15490 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
154a0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
154b0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
154c0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
154d0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
154e0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
154f0 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
15500 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
15510 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
15520 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
15530 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
15540 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15550 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
15560 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
15570 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
15580 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
15590 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
155a0 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
155b0 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
155c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
155d0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
155e0 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
155f0 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
15600 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
15610 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
15620 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
15630 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
15640 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
15650 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
15660 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
15670 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
15680 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
15690 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
156a0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
156b0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
156c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
156d0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
156e0 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
156f0 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
15700 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
15710 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
15720 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
15730 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
15740 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
15750 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
15760 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
15770 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15780 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
15790 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
157a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
157b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
157c0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
157d0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
157e0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
157f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15800 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
15810 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
15820 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
15830 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
15840 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
15850 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
15860 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
15870 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
15880 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
15890 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
158a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
158b0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
158c0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
158d0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
158e0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
158f0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
15900 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
15910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15920 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
15930 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15940 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
15950 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
15960 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15970 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15980 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15990 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
159a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
159b0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
159c0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
159d0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
159e0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
159f0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
15a00 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
15a10 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
15a20 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
15a30 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
15a40 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
15a50 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
15a60 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
15a70 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
15a80 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
15a90 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
15aa0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
15ad0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
15ae0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15b10 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
15b20 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
15b30 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
15b60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15b70 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
15b80 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
15b90 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
15ba0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
15bb0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
15bc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15bd0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
15be0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15bf0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
15c00 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
15c10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15c20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
15c30 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
15c40 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
15c50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
15c60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
15c70 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
15c80 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
15c90 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
15ca0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
15cb0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
15cc0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
15cd0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15ce0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
15cf0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
15d00 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
15d10 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
15d20 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
15d30 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
15d40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15d50 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
15d60 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
15d70 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
15d80 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15d90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15da0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
15db0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
15dc0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
15dd0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
15de0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
15df0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
15e00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
15e10 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
15e20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
15e30 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
15e40 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
15e50 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
15e60 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
15e70 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
15e80 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
15e90 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
15ea0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
15eb0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
15ec0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
15ed0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
15ee0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
15ef0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
15f00 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
15f10 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
15f20 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
15f50 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
15f60 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
15f70 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
15f80 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
15f90 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
15fa0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15fb0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
15fc0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
15fd0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
15fe0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
15ff0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
16000 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
16010 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16020 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
16030 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
16040 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
16050 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
16060 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
16070 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
16080 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
16090 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
160a0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
160b0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
160c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
160d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
160e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
160f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
16100 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
16110 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
16120 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16130 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
16140 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
16150 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
16160 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16170 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
16180 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
16190 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
161a0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
161b0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
161c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
161d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
161e0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
161f0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
16200 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
16210 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
16220 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
16230 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
16240 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
16250 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
16260 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
16270 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
16280 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
16290 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
162a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
162b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
162c0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
162d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
162e0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
162f0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
16300 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
16310 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
16320 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
16330 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
16340 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
16350 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
16360 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
16370 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
16380 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
16390 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
163a0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
163b0 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
163c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
163d0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
163e0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
163f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
16400 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16410 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16420 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
16430 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
16440 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
16450 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
16460 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16470 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
16480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
16490 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
164a0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
164b0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
164c0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
164d0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
164e0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
164f0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
16500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16510 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16520 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
16530 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
16540 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
16550 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
16560 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
16570 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
16580 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
16590 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
165a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
165b0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
165c0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
165d0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
165e0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
165f0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
16600 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
16610 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
16620 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
16630 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
16640 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
16650 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
16660 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
16670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
16680 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
16690 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
166a0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
166b0 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
166c0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
166d0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
166e0 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
166f0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
16700 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
16710 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
16720 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
16730 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
16740 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
16750 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
16760 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
16770 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
16780 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
16790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
167a0 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
167b0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
167c0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
167d0 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
167e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
167f0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
16800 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
16810 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
16820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16830 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
16840 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
16850 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
16860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
16870 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
16880 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
16890 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
168a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
168b0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
168c0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
168d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
168e0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
168f0 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
16900 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
16910 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
16920 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
16930 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
16940 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16950 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
16960 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
16970 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
16980 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
16990 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
169a0 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
169b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
169c0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
169d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
169e0 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
169f0 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
16a00 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
16a10 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
16a20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
16a30 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
16a40 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
16a50 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
16a60 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
16a70 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
16a80 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
16a90 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
16aa0 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
16ab0 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
16ac0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16ad0 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
16ae0 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
16af0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
16b00 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
16b10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16b20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16b30 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
16b40 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
16b50 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
16b60 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
16b70 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
16b80 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
16b90 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
16ba0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
16bb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
16bc0 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
16bd0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
16be0 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
16bf0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
16c00 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
16c10 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
16c20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
16c30 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
16c40 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
16c50 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
16c60 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
16c70 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
16c80 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
16c90 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
16ca0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
16cb0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
16cc0 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
16cd0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
16ce0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
16cf0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
16d00 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
16d10 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
16d20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
16d30 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
16d40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
16d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16d70 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
16d80 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
16d90 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
16da0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
16db0 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
16dc0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
16dd0 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
16de0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
16df0 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
16e00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16e20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16e30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e40 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
16e50 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
16e60 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
16e70 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
16e80 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
16e90 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
16ea0 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
16eb0 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
16ec0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
16ed0 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
16ee0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
16ef0 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
16f00 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
16f10 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
16f20 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
16f30 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
16f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16f50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16f60 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
16f70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
16f80 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
16f90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
16fa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16fb0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
16fc0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
16fd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16fe0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
16ff0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
17000 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
17010 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
17020 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
17030 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
17040 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17060 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
17070 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
17080 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
17090 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
170a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
170b0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
170c0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
170d0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
170e0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
170f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
17100 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
17110 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
17120 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
17130 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
17140 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
17150 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
17160 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
17170 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
17180 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
17190 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
171a0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
171b0 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
171c0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
171d0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
171e0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
171f0 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
17200 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
17210 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
17220 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
17230 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
17240 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
17250 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
17260 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
17270 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
17280 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
17290 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
172a0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
172b0 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
172c0 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74   assumes.** that
172d0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
172e0 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
172f0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
17300 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72  ntil.** it retur
17310 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
17320 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  r an error, and 
17330 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65  that nFin is the
17340 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  .** number of pa
17350 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ges the database
17360 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61   file will conta
17370 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a  in after this .*
17380 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d  * process is com
17390 70 6c 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20  plete.  If nFin 
173a0 69 73 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  is zero, it is a
173b0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69  ssumed that.** i
173c0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
173d0 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
173e0 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f   finite amount o
173f0 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68  f times.** which
17400 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17410 65 6d 70 74 79 20 74 68 65 20 66 72 65 65 6c 69  empty the freeli
17420 73 74 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f  st.  A full auto
17430 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46  vacuum.** has nF
17440 69 6e 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41  in>0.  A "PRAGMA
17450 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63   incremental_vac
17460 75 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30  uum" has nFin==0
17470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17480 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
17490 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
174a0 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
174b0 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e  astPg){.  Pgno n
174c0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
174d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
174e0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
174f0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
17500 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
17510 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
17520 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
17530 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
17540 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
17550 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
17560 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
17570 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
17580 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
17590 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
175a0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
175b0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
175c0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
175d0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
175e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
175f0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
17600 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
17610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17620 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
17630 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
17640 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
17650 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
17660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
17680 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17690 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
176a0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
176b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
176c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
176d0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
176e0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
176f0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
17700 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
17710 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
17720 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
17730 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
17740 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
17750 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
17760 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
17770 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
17780 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
17790 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
177a0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
177b0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
177c0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
177d0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
177e0 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
177f0 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
17800 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
17810 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
17820 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
17830 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
17840 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
17850 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
17860 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
17870 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
17880 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
17890 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
178a0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
178b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
178c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
178d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
178e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
178f0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
17900 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
17910 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
17920 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17930 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
17940 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
17950 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17960 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
17970 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
17980 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
17990 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
179a0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
179b0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
179c0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
179d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
179e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
179f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17a00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
17a10 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
17a20 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
17a30 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
17a40 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
17a50 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
17a60 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
17a70 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
17a80 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
17a90 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
17aa0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
17ab0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46  ther hand, if nF
17ac0 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68  in is greater th
17ad0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
17ae0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
17af0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
17b00 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
17b10 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
17b20 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
17b30 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
17b40 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
17b50 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  /.      do {.   
17b60 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
17b70 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
17b80 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
17b90 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
17ba0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30  ePg, &iFreePg, 0
17bb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
17bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
17be0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
17bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
17c00 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
17c10 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
17c20 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
17c30 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46        }while( nF
17c40 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67  in!=0 && iFreePg
17c50 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
17c60 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
17c70 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
17c80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17c90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
17ca0 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  astPg->pDbPage);
17cb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
17cc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17cd0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
17ce0 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
17cf0 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
17d00 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46  age, iFreePg, nF
17d10 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
17d20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17d30 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
17d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17d50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17d60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17d70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
17d80 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
17d90 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
17da0 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d   while( iLastPg=
17db0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17dc0 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
17dd0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
17de0 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tPg) ){.      if
17df0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
17e00 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
17e10 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
17e20 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72   *pPg;.        r
17e30 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
17e40 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
17e50 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  pPg, 0);.       
17e60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17e70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17e80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
17ea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17eb0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
17ec0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
17ed0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
17ee0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17f00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17f20 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
17f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17f40 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
17f50 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
17f60 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 20  r, iLastPg);.   
17f70 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
17f80 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
17f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17fa0 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
17fb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
17fc0 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
17fd0 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
17fe0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
17ff0 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
18000 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
18010 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
18020 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
18030 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
18040 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
18050 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
18060 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
18070 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
18080 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
18090 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
180a0 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
180b0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
180c0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
180d0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
180e0 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
180f0 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
18100 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
18110 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
18120 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
18130 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18140 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
18150 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18160 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18170 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18180 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
18190 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
181a0 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
181b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
181c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
181d0 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
181e0 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
181f0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
18200 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
18210 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
18220 42 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67 65  Bt, 0, btreePage
18230 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 20  count(pBt));.   
18240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
18260 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18270 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
18280 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18290 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
182a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
182b0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
182c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
182d0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
182e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
182f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18300 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
18310 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
18320 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
18330 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
18340 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
18350 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
18360 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
18370 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
18380 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
18390 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
183a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
183b0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
183c0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
183d0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
183e0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
183f0 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
18400 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
18410 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
18420 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
18430 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
18440 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
18450 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
18460 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
18470 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
18480 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
18490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
184a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
184b0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
184c0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
184d0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
184e0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
184f0 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
18500 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18510 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
18520 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
18530 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
18540 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
18550 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
18560 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
18570 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
18580 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
18590 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
185a0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
185b0 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
185c0 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
185d0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
185e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
185f0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
18600 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
18610 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
18620 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
18630 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
18640 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
18650 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
18660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
18670 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
18680 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eed */.    int n
18690 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Entry;        /*
186a0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
186b0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
186c0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
186d0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
186e0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
186f0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
18700 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
18710 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
18720 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
18730 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
18740 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
18750 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18760 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
18770 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
18780 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
18790 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
187a0 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
187b0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
187c0 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
187d0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
187e0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
187f0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
18800 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
18810 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
18820 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
18830 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
18840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18850 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
18860 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
18870 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18880 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
18890 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  .    nEntry = pB
188a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
188b0 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
188c0 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
188d0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
188e0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
188f0 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  ntry;.    nFin =
18900 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
18910 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
18920 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
18930 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
18940 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
18950 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
18960 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
18970 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
18980 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
18990 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
189a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
189b0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
189c0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
189d0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
189e0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
189f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18a00 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
18a10 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
18a20 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
18a30 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
18a40 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
18a50 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
18a60 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
18a70 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
18a80 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
18a90 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
18aa0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
18ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18ac0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
18ad0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
18ae0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
18af0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
18b00 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
18b10 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
18b20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
18b30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
18b40 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18b50 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
18b60 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  in);.      sqlit
18b70 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
18b80 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
18b90 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
18ba0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
18bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18bc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18bd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
18be0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
18bf0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
18c00 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
18c10 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
18c20 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
18c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18c40 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
18c50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18c60 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
18c70 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
18c80 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
18c90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
18ca0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
18cb0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
18cc0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
18cd0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
18ce0 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
18cf0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18d00 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
18d10 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
18d20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
18d30 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
18d40 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
18d50 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
18d60 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
18d70 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
18d80 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
18d90 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
18da0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
18db0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
18dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
18dd0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
18de0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
18df0 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
18e00 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
18e10 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
18e20 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
18e30 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
18e40 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
18e50 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
18e60 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
18e70 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
18e80 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
18e90 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
18ea0 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
18eb0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
18ec0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
18ed0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
18ee0 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
18ef0 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
18f00 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
18f10 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
18f20 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
18f30 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
18f40 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
18f50 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
18f60 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
18f70 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
18f80 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
18f90 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
18fa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
18fb0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
18fc0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
18fd0 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
18fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18ff0 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
19000 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
19010 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
19020 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
19030 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
19040 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
19050 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
19060 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
19070 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
19080 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
19090 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
190a0 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
190b0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
190c0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
190d0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
190e0 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
190f0 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
19100 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
19110 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
19120 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
19130 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
19140 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
19150 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
19160 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
19170 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
19180 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
19190 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
191a0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
191b0 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
191c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
191d0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
191e0 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
191f0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19200 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
19210 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
19220 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
19230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19240 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
19250 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
19260 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
19270 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
19280 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19290 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
192a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
192b0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
192c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
192d0 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
192e0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
192f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19310 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19320 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
19330 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19340 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
19350 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
19360 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
19370 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
19380 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
19390 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
193a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
193b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
193c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
193d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
193e0 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
193f0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
19400 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
19410 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
19420 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
19430 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
19440 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
19450 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
19460 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
19470 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19490 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
194a0 28 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43  (p) );..  btreeC
194b0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
194c0 42 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  Bt);.  if( p->in
194d0 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
194e0 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76   && p->db->activ
194f0 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20  eVdbeCnt>1 ){.  
19500 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
19510 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
19520 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
19530 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
19540 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
19550 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
19560 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
19570 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
19580 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
19590 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
195a0 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
195b0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
195c0 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
195d0 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
195e0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
195f0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
19600 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
19610 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
19620 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
19630 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
19640 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
19650 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
19660 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
19670 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
19680 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
19690 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
196a0 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
196b0 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
196c0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
196d0 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
196e0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
196f0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
19700 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
19710 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
19720 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
19730 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
19740 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
19750 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
19760 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
19770 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
19780 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
19790 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
197a0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
197b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
197c0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
197d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
197e0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
197f0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
19800 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
19810 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
19820 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
19830 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
19840 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
19850 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
19860 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
19870 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
19880 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
19890 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
198a0 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
198b0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
198c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
198d0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
198e0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
198f0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
19900 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
19910 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
19920 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
19930 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
19940 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
19950 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
19960 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
19970 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
19980 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
19990 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
199a0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
199b0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
199c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
199d0 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
199e0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
199f0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
19a00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
19a10 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
19a20 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
19a30 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
19a40 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
19a50 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
19a60 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
19a70 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
19a80 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
19a90 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
19aa0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
19ab0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
19ac0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
19ad0 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
19ae0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
19af0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
19b00 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
19b10 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
19b20 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
19b30 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
19b40 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
19b50 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
19b60 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
19b70 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
19b80 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
19b90 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
19ba0 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
19bb0 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
19bc0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
19bd0 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
19be0 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
19bf0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
19c00 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
19c10 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
19c20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
19c30 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
19c40 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
19c50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
19c60 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19c70 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
19c80 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
19c90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19ca0 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
19cb0 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
19cc0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
19cd0 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
19ce0 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
19cf0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
19d00 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
19d10 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
19d20 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
19d30 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
19d40 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
19d50 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
19d60 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
19d70 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
19d80 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
19d90 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
19da0 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
19db0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
19dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
19dd0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
19de0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
19df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
19e00 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
19e10 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
19e20 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
19e30 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
19e40 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
19e50 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
19e60 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
19e70 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
19e80 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
19e90 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
19ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19eb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19ec0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
19ed0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
19ee0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
19ef0 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
19f00 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
19f10 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
19f20 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
19f30 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
19f40 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
19f50 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
19f60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
19f70 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19f80 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
19f90 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
19fa0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
19fc0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
19fd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
19fe0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
19ff0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1a000 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a010 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1a020 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1a030 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1a040 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1a050 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1a060 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a070 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1a080 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a090 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1a0a0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1a0b0 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
1a0c0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1a0d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1a0e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1a0f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a100 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1a110 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1a120 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1a130 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1a140 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1a150 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1a160 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1a170 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1a180 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1a190 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1a1a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a1b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1a1c0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1a1d0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1a1e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a1f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a200 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1a210 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a220 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
1a230 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
1a240 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
1a250 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1a260 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1a270 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1a280 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1a290 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1a2a0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1a2b0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1a2c0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1a2d0 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
1a2e0 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
1a2f0 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
1a300 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
1a310 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
1a320 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
1a330 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
1a340 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
1a350 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
1a360 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
1a370 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
1a380 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
1a390 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
1a3a0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
1a3b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1a3c0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1a3d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1a3e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1a3f0 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1a400 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1a410 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1a420 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1a430 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1a440 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
1a450 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
1a460 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
1a470 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
1a480 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1a490 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1a4a0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1a4b0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1a4c0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1a4d0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1a4e0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1a4f0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1a500 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1a510 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1a520 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1a530 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1a540 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1a550 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1a560 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1a570 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1a580 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1a590 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1a5a0 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1a5b0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1a5c0 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1a5d0 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1a5e0 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1a5f0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1a600 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1a610 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1a620 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1a630 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1a640 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1a650 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1a660 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1a670 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1a680 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1a690 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1a6a0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1a6b0 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1a6c0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1a6d0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1a6e0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1a6f0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1a700 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1a710 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1a720 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1a730 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1a740 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
1a750 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1a760 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1a770 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1a780 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1a790 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
1a7a0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1a7b0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
1a7c0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a7d0 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
1a7e0 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
1a7f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1a800 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
1a810 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1a820 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
1a830 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
1a840 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
1a850 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1a860 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1a870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1a880 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
1a890 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
1a8a0 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
1a8b0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
1a8c0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
1a8d0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
1a8e0 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
1a8f0 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
1a900 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
1a910 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
1a920 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
1a930 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
1a940 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
1a950 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1a960 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1a970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a980 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1a990 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1a9a0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1a9b0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1a9c0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1a9d0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
1a9e0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1a9f0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1aa00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1aa10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1aa20 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1aa30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1aa40 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1aa50 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
1aa60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1aa70 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1aa80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1aa90 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
1aaa0 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
1aab0 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
1aac0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
1aad0 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  r occurred whils
1aae0 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
1aaf0 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
1ab00 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
1ab10 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
1ab20 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
1ab30 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
1ab40 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
1ab50 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
1ab60 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
1ab70 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
1ab80 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
1ab90 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
1aba0 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
1abb0 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
1abc0 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
1abd0 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
1abe0 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
1abf0 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
1ac00 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
1ac10 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
1ac20 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
1ac30 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
1ac40 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
1ac50 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
1ac60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
1ac70 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
1ac80 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
1ac90 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1aca0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
1acb0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1acc0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1acd0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
1ace0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
1acf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ad00 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
1ad10 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1ad20 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
1ad30 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
1ad40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ad50 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1ad60 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
1ad70 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1ad80 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
1ad90 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
1ada0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
1adb0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
1adc0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
1add0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
1ade0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
1adf0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
1ae00 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
1ae10 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1ae20 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1ae30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1ae40 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
1ae50 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
1ae60 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
1ae70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ae80 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
1ae90 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
1aea0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
1aeb0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1aec0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1aed0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1aee0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
1aef0 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
1af00 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1af10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1af20 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
1af30 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
1af40 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
1af50 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
1af60 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1af70 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1af80 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
1af90 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
1afa0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1afb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1afc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
1afd0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
1afe0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1aff0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1b000 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  can can be rolle
1b010 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
1b020 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
1b030 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
1b040 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
1b050 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
1b060 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
1b070 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
1b080 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1b090 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
1b0a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
1b0b0 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
1b0c0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
1b0d0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
1b0e0 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
1b0f0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
1b100 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
1b110 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
1b120 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
1b130 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
1b140 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
1b150 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
1b160 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
1b170 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
1b180 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
1b190 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
1b1a0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
1b1b0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
1b1c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
1b1d0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1b1e0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
1b1f0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
1b200 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
1b210 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
1b220 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1b230 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
1b240 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
1b250 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
1b260 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
1b270 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1b280 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1b290 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
1b2a0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
1b2b0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1b2c0 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
1b2d0 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
1b2e0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1b2f0 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
1b300 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
1b310 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
1b320 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
1b330 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
1b340 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
1b350 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
1b360 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
1b370 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
1b380 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
1b390 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
1b3a0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1b3b0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1b3c0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
1b3d0 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
1b3e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1b3f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b400 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
1b410 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1b420 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1b430 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1b440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1b450 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
1b460 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1b470 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1b480 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1b490 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1b4a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1b4b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b4c0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1b4d0 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1b4e0 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1b4f0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1b500 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1b510 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1b520 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1b530 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1b540 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1b550 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1b560 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1b570 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1b580 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1b590 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1b5a0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1b5b0 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1b5c0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1b5d0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1b5e0 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1b5f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1b600 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1b610 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1b620 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1b630 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b640 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b650 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1b660 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1b670 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1b680 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1b690 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1b6a0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1b6b0 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1b6c0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1b6d0 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1b6e0 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1b6f0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1b700 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1b710 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1b720 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1b730 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1b740 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1b750 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1b760 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1b770 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1b780 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1b790 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1b7a0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1b7b0 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1b7c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1b7d0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1b7e0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1b7f0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1b800 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1b810 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1b820 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1b830 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1b840 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1b850 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1b860 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1b870 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1b880 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b890 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1b8a0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1b8b0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1b8c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b8d0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1b8e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1b8f0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1b900 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1b910 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1b920 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1b930 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1b940 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1b950 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1b960 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1b970 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1b980 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1b990 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1b9a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b9b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1b9c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1b9d0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1b9e0 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1b9f0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1ba00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ba10 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1ba20 6f 69 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69  oint<0 && pBt->i
1ba30 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20  nitiallyEmpty ) 
1ba40 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
1ba50 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1ba60 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1ba70 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1ba80 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1ba90 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1baa0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1bab0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1bac0 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1bad0 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1bae0 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1baf0 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1bb00 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1bb10 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1bb20 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1bb30 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1bb40 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1bb50 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1bb60 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1bb70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1bb80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1bb90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1bba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1bbb0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1bbc0 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1bbd0 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1bbe0 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1bbf0 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1bc00 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1bc10 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1bc20 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1bc30 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1bc40 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1bc50 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1bc60 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1bc70 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1bc80 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1bc90 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1bca0 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1bcb0 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1bcc0 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1bcd0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1bce0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1bcf0 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1bd00 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1bd10 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1bd20 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1bd30 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1bd40 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1bd50 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1bd60 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1bd70 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1bd80 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1bd90 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1bda0 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1bdb0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1bdc0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1bdd0 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1bde0 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1bdf0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1be00 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1be10 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1be20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1be30 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1be40 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1be50 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1be60 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1be70 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1be80 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1be90 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1bea0 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1beb0 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1bec0 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1bed0 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1bee0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1bef0 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1bf00 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1bf10 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1bf20 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1bf30 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1bf40 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1bf50 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1bf60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1bf70 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1bf80 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1bf90 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1bfa0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1bfb0 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1bfc0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1bfd0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1bfe0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1bff0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1c000 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1c010 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1c020 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1c030 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1c040 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1c050 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1c060 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1c070 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1c080 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1c090 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1c0a0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1c0b0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1c0c0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1c0d0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1c0e0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1c0f0 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1c100 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1c110 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1c120 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1c130 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c160 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1c170 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1c1a0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1c1b0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1c1c0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1e0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1c1f0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1c200 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1c210 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1c220 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1c230 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1c240 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1c250 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1c280 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1c290 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1c2a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c2c0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1c2d0 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1c2e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c2f0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c300 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1c310 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1c320 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1c330 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1c340 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1c350 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1c360 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1c370 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1c380 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1c390 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1c3a0 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1c3b0 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1c3c0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1c3d0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1c3e0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1c3f0 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1c400 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1c410 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1c420 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1c430 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1c440 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1c450 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1c460 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1c470 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1c480 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1c490 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1c4a0 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1c4b0 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1c4c0 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1c4d0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1c4e0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1c4f0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1c500 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1c510 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1c520 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c530 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1c540 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1c550 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1c560 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1c570 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e  g && pBt->readOn
1c580 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ly) ){.    retur
1c590 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1c5a0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  Y;.  }.  if( iTa
1c5b0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1c5c0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1c5d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c5e0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
1c5f0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
1c600 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1c610 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1c620 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1c630 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1c640 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1c650 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1c660 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1c670 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1c680 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1c690 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1c6a0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1c6b0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1c6c0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1c6d0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1c6e0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1c6f0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1c700 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
1c710 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
1c720 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
1c730 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
1c740 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1c750 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
1c760 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
1c770 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
1c780 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
1c790 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1c7a0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
1c7b0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1c7c0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1c7d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1c7e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1c7f0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1c830 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1c870 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1c880 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c8b0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1c8c0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1c8d0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1c8e0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1c8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c900 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1c910 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1c920 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c940 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1c950 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1c960 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1c970 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1c980 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1c990 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1c9a0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1c9b0 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1c9c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c9d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1c9e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1c9f0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1ca00 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1ca10 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1ca20 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1ca30 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1ca40 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1ca50 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1ca60 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1ca70 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1ca80 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1ca90 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1caa0 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1cab0 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1cac0 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1cad0 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1cae0 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1caf0 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1cb00 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1cb10 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1cb20 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1cb30 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
1cb40 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
1cb50 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1cb60 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1cb70 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1cb80 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
1cb90 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
1cba0 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
1cbb0 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
1cbc0 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
1cbd0 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
1cbe0 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
1cbf0 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
1cc00 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
1cc10 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
1cc20 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
1cc30 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
1cc40 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
1cc50 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
1cc60 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
1cc70 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
1cc80 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1cc90 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
1cca0 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
1ccb0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1ccc0 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
1ccd0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1cce0 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
1ccf0 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
1cd00 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
1cd10 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
1cd20 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
1cd30 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
1cd40 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
1cd50 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
1cd60 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
1cd70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
1cd80 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
1cd90 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
1cda0 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
1cdb0 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
1cdc0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1cdd0 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
1cde0 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
1cdf0 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
1ce00 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
1ce10 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
1ce20 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
1ce30 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
1ce40 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
1ce50 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1ce60 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
1ce70 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
1ce80 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1ce90 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
1cea0 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
1ceb0 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
1cec0 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
1ced0 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
1cee0 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
1cef0 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
1cf00 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
1cf10 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
1cf20 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
1cf30 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
1cf40 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
1cf50 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
1cf60 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1cf70 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
1cf80 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
1cf90 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1cfa0 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
1cfb0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1cfc0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1cfd0 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1cfe0 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
1cff0 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
1d000 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
1d010 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d020 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
1d030 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
1d040 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
1d050 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
1d060 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
1d070 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
1d080 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
1d090 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1d0a0 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
1d0b0 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
1d0c0 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
1d0d0 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
1d0e0 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
1d0f0 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
1d100 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
1d110 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
1d120 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1d130 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
1d140 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1d150 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d160 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
1d170 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
1d180 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1d190 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
1d1a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d1b0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
1d1c0 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
1d1d0 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
1d1e0 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
1d1f0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
1d200 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
1d210 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
1d220 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
1d230 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
1d240 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
1d250 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1d260 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1d270 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d280 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1d290 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1d2a0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1d2b0 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1d2c0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
1d2d0 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
1d2e0 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
1d2f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d300 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1d310 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1d320 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1d330 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
1d340 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1d350 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
1d360 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
1d370 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
1d380 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1d390 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1d3a0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1d3b0 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
1d3c0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1d3d0 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
1d3e0 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1d3f0 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
1d400 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1d410 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1d420 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1d430 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1d440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d450 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1d460 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
1d470 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1d480 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
1d490 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1d4a0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
1d4b0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d4c0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
1d4d0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1d4e0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1d4f0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1d500 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1d510 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1d520 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1d530 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1d540 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1d550 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1d560 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
1d570 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
1d580 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
1d590 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
1d5a0 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1d5b0 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
1d5c0 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
1d5d0 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
1d5e0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
1d5f0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1d600 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
1d610 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
1d620 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
1d630 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
1d640 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
1d650 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
1d660 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
1d670 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
1d680 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
1d690 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
1d6a0 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
1d6b0 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
1d6c0 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1d6d0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1d6e0 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1d6f0 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1d700 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1d710 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1d720 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1d730 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1d740 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1d750 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1d760 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1d770 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1d780 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1d790 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1d7a0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1d7b0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1d7c0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1d7d0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1d7e0 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1d7f0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1d800 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
1d810 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
1d820 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
1d830 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
1d840 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
1d850 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
1d860 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
1d870 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
1d880 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
1d890 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
1d8a0 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
1d8b0 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
1d8c0 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
1d8d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d8e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1d8f0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
1d900 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20        int iPage 
1d910 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1d920 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
1d930 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1d940 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1d950 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1d960 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
1d970 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1d980 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1d990 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
1d9a0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
1d9b0 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
1d9c0 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
1d9d0 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
1d9e0 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
1d9f0 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
1da00 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
1da10 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
1da20 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
1da30 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
1da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1da70 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1da80 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1dac0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1dad0 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20  ur->iPage;      
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1db10 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1db20 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1db30 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1db40 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1db50 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75  info); \.    pCu
1db60 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1db70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1dbb0 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
1dc00 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1dc10 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
1dc50 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
1dc60 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  ER */..#ifndef N
1dc70 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
1dc80 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
1dc90 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1dca0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1dcb0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
1dcc0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
1dcd0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
1dce0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
1dcf0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
1dd00 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
1dd10 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
1dd20 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
1dd30 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
1dd40 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
1dd50 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
1dd60 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1dd70 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1dd80 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
1dd90 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1dda0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
1ddb0 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1ddc0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
1ddd0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1dde0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
1ddf0 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
1de00 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1de10 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1de20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1de30 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1de40 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1de50 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1de60 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1de70 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1de80 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1de90 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1dea0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1deb0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1dec0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1ded0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1dee0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1def0 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1df00 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1df10 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1df20 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
1df30 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
1df40 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
1df50 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1df60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1df70 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
1df80 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
1df90 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
1dfa0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
1dfb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1dfc0 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
1dfd0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1dfe0 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1dff0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1e000 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1e010 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1e020 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1e030 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1e040 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1e050 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
1e060 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1e070 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53  VALID ){.    *pS
1e080 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
1e090 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66  {.    getCellInf
1e0a0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53  o(pCur);.    *pS
1e0b0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1e0c0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74  .nKey;.  }.  ret
1e0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e0e0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1e0f0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1e100 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1e110 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1e120 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1e130 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1e140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1e150 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
1e160 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
1e170 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1e180 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
1e190 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
1e1a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1e1b0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1e1c0 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
1e1d0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
1e1e0 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
1e1f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e200 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
1e210 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
1e220 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
1e230 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
1e240 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1e250 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
1e260 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
1e270 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
1e280 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
1e290 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
1e2a0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
1e2b0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
1e2c0 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
1e2d0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1e2e0 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
1e2f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1e300 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
1e310 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e320 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e330 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e340 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e350 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
1e360 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
1e370 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1e380 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75  fo.nData;.  retu
1e390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e3a0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1e3b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e3c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1e3d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1e3e0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
1e3f0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
1e400 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
1e410 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1e420 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1e430 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
1e440 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
1e450 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
1e460 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
1e470 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
1e480 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
1e490 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
1e4a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1e4b0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
1e4c0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
1e4d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
1e4e0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e4f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1e500 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
1e510 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1e520 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
1e530 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1e540 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
1e550 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
1e560 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
1e570 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
1e580 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
1e590 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
1e5a0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
1e5b0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
1e5c0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
1e5d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
1e5e0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1e5f0 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
1e600 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1e610 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
1e620 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
1e630 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
1e640 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
1e650 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
1e660 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
1e670 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1e680 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1e690 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
1e6a0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
1e6b0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
1e6c0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
1e6d0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
1e6e0 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
1e6f0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
1e700 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
1e710 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
1e720 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
1e730 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
1e740 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1e750 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1e760 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
1e770 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e790 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
1e7a0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
1e7b0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
1e7c0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1e7d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1e7e0 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
1e7f0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1e800 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1e810 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1e820 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1e830 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1e840 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1e850 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1e860 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1e870 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1e880 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1e890 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1e8a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e8b0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1e8c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e8d0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e8e0 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1e8f0 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1e900 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e910 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1e920 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1e930 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1e940 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1e950 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1e960 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1e970 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1e980 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1e990 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1e9a0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1e9b0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1e9c0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1e9d0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1e9e0 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1e9f0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1ea00 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1ea10 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1ea20 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1ea30 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1ea40 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1ea50 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1ea60 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1ea70 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1ea80 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1ea90 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1eaa0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1eab0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1eac0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1ead0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1eae0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1eaf0 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1eb00 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1eb10 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
1eb20 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1eb30 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1eb40 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1eb50 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1eb60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1eb70 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1eb80 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1eb90 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1eba0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1ebb0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1ebc0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1ebd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ebe0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1ebf0 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
1ec00 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1ec10 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ec20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1ec30 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1ec40 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
1ec50 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1ec60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ec70 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
1ec80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ec90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1eca0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1ecb0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1ecc0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1ecd0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1ece0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1ecf0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1ed00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ed10 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1ed20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ed30 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ed40 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1ed50 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1ed60 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1ed70 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1ed80 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1ed90 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1eda0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1edb0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1edc0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1edd0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1ede0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1edf0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1ee00 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1ee10 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1ee20 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1ee30 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1ee40 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1ee50 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1ee60 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1ee70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1ee80 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1ee90 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1eea0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1eeb0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1eec0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1eed0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1eee0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1eef0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1ef00 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1ef10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1ef20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1ef30 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1ef40 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1ef50 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1ef60 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1ef70 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef90 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1efa0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1efb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1efc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1efd0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1efe0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1eff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1f000 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1f010 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1f020 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1f030 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1f040 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1f050 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1f060 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1f070 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1f080 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1f090 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1f0a0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1f0b0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1f0c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1f0d0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1f0e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f0f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1f110 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1f120 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1f130 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1f140 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1f150 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1f160 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1f170 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1f180 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1f190 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1f1a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f1b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f1c0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1f1d0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
1f1e0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1f1f0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
1f200 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
1f210 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1f220 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
1f230 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
1f240 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
1f250 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
1f260 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
1f270 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1f280 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
1f290 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
1f2a0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
1f2b0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
1f2c0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
1f2d0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
1f2e0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1f2f0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
1f300 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
1f310 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
1f320 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1f330 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
1f340 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
1f350 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
1f360 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
1f370 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
1f380 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
1f390 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
1f3a0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
1f3b0 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
1f3c0 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
1f3d0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
1f3e0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
1f3f0 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
1f400 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1f410 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1f420 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1f430 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
1f440 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
1f450 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
1f460 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f470 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
1f480 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
1f490 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
1f4a0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
1f4b0 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
1f4c0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
1f4d0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
1f4e0 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
1f4f0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
1f500 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1f510 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1f520 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1f530 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
1f540 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
1f550 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
1f560 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
1f570 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
1f580 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
1f590 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1f5a0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
1f5b0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
1f5c0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
1f5d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
1f5e0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
1f5f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f600 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
1f610 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
1f620 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
1f630 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
1f640 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
1f650 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
1f660 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
1f670 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
1f680 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
1f690 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
1f6a0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
1f6b0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1f6c0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1f6d0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1f6e0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1f6f0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
1f700 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
1f710 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
1f720 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
1f730 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
1f740 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1f750 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
1f760 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
1f770 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
1f780 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
1f790 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
1f7a0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
1f7b0 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
1f7c0 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
1f7d0 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
1f7e0 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
1f7f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1f800 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
1f810 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f820 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
1f830 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
1f840 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1f850 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f860 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
1f870 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
1f880 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
1f890 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1f8a0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1f8b0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1f8c0 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
1f8d0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
1f8e0 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
1f8f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1f900 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f910 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1f920 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f930 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1f940 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
1f950 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f960 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
1f970 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1f980 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
1f990 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
1f9a0 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
1f9b0 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
1f9c0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
1f9d0 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
1f9e0 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
1f9f0 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74  if( NEVER(offset
1fa00 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
1fa10 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20  ->info.nData) . 
1fa20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
1fa30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1fa40 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
1fa50 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
1fa60 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
1fa70 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
1fa80 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
1fa90 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
1faa0 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
1fab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fac0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fad0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
1fae0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
1faf0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
1fb00 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
1fb10 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
1fb20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
1fb30 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1fb40 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1fb50 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
1fb60 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
1fb70 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
1fb80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1fb90 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
1fba0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
1fbb0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1fbc0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
1fbd0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
1fbe0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
1fbf0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
1fc00 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
1fc10 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
1fc20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
1fc30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1fc40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1fc50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1fc60 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
1fc70 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
1fc80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1fc90 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
1fca0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
1fcb0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
1fcc0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
1fcd0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1fce0 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
1fcf0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
1fd00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fd10 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1fd20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
1fd30 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1fd40 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
1fd50 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
1fd60 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
1fd70 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1fd80 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
1fd90 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
1fda0 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
1fdb0 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
1fdc0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
1fdd0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1fde0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1fdf0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
1fe00 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
1fe10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1fe20 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
1fe30 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
1fe40 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
1fe50 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
1fe60 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
1fe70 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
1fe80 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
1fe90 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
1fea0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
1feb0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1fec0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1fed0 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1fee0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
1fef0 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
1ff00 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
1ff10 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
1ff20 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
1ff30 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
1ff40 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
1ff50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
1ff60 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
1ff70 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1ff80 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61     /* nOvfl is a
1ff90 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
1ffa0 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f   If it were zero
1ffb0 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77  , fetchPayload w
1ffc0 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20  ould have.      
1ffd0 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73  ** been used ins
1ffe0 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75  tead of this rou
1fff0 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  tine. */.      i
20000 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29  f( ALWAYS(nOvfl)
20010 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
20020 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
20030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
20040 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
20050 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
20060 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
20070 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
20080 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
20090 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
200a0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
200b0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
200c0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
200d0 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
200e0 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
200f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
20100 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
20110 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
20120 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
20130 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
20140 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
20150 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
20160 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
20170 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
20180 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
20190 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
201a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
201b0 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
201c0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
201d0 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
201e0 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
201f0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
20200 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
20210 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
20220 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
20230 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
20240 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
20250 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
20260 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
20270 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
20280 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
20290 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
202a0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
202b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
202c0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
202d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
202e0 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
202f0 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
20300 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
20310 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
20320 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
20330 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
20340 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
20350 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
20360 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
20370 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
20380 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
20390 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
203a0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
203b0 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
203c0 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
203d0 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
203e0 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
203f0 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
20400 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
20410 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
20420 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
20430 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
20440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
20450 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
20460 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20470 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
20480 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
20490 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
204a0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
204b0 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
204c0 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
204d0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
204e0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
204f0 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
20500 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
20510 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
20520 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
20530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20540 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
20550 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
20560 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
20570 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
20580 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
20590 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
205a0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
205b0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
205c0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
205d0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
205e0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
205f0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
20600 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
20610 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
20620 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
20630 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
20640 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
20650 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
20660 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
20670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
20680 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
20690 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
206a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
206b0 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
206c0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
206d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
206e0 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
206f0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
20700 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
20710 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
20720 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
20730 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
20740 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
20750 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
20760 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
20770 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
20780 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
20790 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
207a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
207b0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
207c0 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
207d0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
207e0 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
207f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
20800 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
20810 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
20820 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20830 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
20840 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
20850 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
20860 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
20870 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
20880 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
20890 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
208a0 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
208b0 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
208c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
208d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
208e0 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20    if( eOp==0    
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20910 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
20920 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
20930 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20960 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
20970 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
20980 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
20990 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
209a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34             /* (4
209b0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
209c0 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
209d0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
209e0 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
209f0 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
20a00 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70         && pBt->p
20a10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d  Page1->aData[19]
20a20 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20  ==0x01          
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a40 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (5) */.        )
20a50 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
20a60 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
20a70 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
20a80 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
20a90 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
20aa0 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
20ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20ac0 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
20ad0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 70 42 74  aWrite, a+4, pBt
20ae0 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 6e 65  ->pageSize * (ne
20af0 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
20b00 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
20b10 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
20b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
20b30 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
20b40 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
20b50 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
20b60 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
20b70 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
20b80 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20ba0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
20bb0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
20bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20be0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50  {.            aP
20bf0 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
20c00 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
20c10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
20c20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
20c30 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
20c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
20c50 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
20c60 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
20c70 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
20c80 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
20c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20ca0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
20cb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
20cc0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
20cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20ce0 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
20cf0 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
20d00 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
20d10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
20d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20d30 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
20d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20d50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
20d60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20d70 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
20d80 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
20d90 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
20da0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
20db0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
20dc0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
20dd0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
20de0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
20df0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
20e00 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  "..**.** The cal
20e10 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
20e20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
20e30 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
20e40 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74   row.** in the t
20e50 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  able..**.** Retu
20e60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
20e70 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
20e80 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
20e90 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
20ea0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
20eb0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
20ec0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
20ed0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
20ee0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
20ef0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
20f00 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
20f10 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
20f20 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
20f30 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
20f40 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20f50 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20f60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20f70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20f80 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
20f90 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
20fa0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
20fb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
20fc0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20fd0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20fe0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
20ff0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
21000 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
21010 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
21020 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
21030 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
21040 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
21050 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
21060 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
21070 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
21080 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
21090 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
210a0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
210b0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
210c0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
210d0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
210e0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
210f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
21100 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
21110 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
21120 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
21130 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
21140 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
21150 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
21160 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
21170 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
21180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21190 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
211a0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
211b0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
211c0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
211d0 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
211e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
211f0 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
21200 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21210 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
21220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
21230 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
21240 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21250 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21260 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
21270 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
21280 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
21290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
212a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
212b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
212c0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
212d0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
212e0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
212f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21300 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21310 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21320 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
21330 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21340 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
21350 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
21360 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
21370 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
21380 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
213a0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
213b0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
213c0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
213d0 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
213e0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
213f0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
21400 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
21410 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
21420 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69  * the key if ski
21430 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70  pKey==0 and it p
21440 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67  oints to the beg
21450 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69  inning of data i
21460 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e  f.** skipKey==1.
21470 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
21480 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62  bytes of availab
21490 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  le key/data is w
214a0 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
214b0 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d  pAmt.  If *pAmt=
214c0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  =0, then the val
214d0 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ue returned will
214e0 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c   not be.** a val
214f0 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  id pointer..**.*
21500 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
21510 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
21520 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e  n.  It is common
21530 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
21540 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20  key.** and data 
21550 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f  to fit on the lo
21560 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72  cal page and for
21570 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20   there to be no 
21580 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
21590 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73  s.  When that is
215a0 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e   so, this routin
215b0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
215c0 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b   access the.** k
215d0 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68  ey and data with
215e0 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70  out making a cop
215f0 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61  y.  If the key a
21600 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c  nd/or data spill
21610 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  s.** onto overfl
21620 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61  ow pages, then a
21630 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d  ccessPayload() m
21640 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72  ust be used to r
21650 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65  eassemble.** the
21660 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f   key/data and co
21670 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65  py it into a pre
21680 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
21690 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
216a0 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ter returned by 
216b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  this routine loo
216c0 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ks directly into
216d0 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70   the cached.** p
216e0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
216f0 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d  ase.  The data m
21700 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d  ight change or m
21710 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ove the next tim
21720 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72  e.** any btree r
21730 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
21740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
21750 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
21760 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
21770 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
21780 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
21790 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
217a0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
217b0 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20  /.  int *pAmt,  
217c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
217d0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
217e0 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
217f0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b  here */.  int sk
21800 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f  ipKey          /
21810 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67  * read beginning
21820 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
21830 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   is true */.){. 
21840 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
21850 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50  aPayload;.  MemP
21860 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33  age *pPage;.  u3
21870 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c  2 nKey;.  u32 nL
21880 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  ocal;..  assert(
21890 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
218a0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
218b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
218c0 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
218d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
218e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
218f0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
21900 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21910 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  r) );.  pPage = 
21920 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21930 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
21940 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
21950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
21960 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
21970 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
21980 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29  info.nSize==0) )
21990 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
219a0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
219b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20  e[pCur->iPage], 
219c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
219d0 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20  ->iPage],.      
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43               &pC
219f0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20  ur->info);.  }. 
21a00 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
21a10 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
21a20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
21a30 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
21a40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
21a50 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
21a60 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
21a70 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43    nKey = (int)pC
21a80 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
21a90 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79   }.  if( skipKey
21aa0 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64   ){.    aPayload
21ab0 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c   += nKey;.    nL
21ac0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
21ad0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b  o.nLocal - nKey;
21ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
21af0 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66  ocal = pCur->inf
21b00 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73  o.nLocal;.    as
21b10 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b  sert( nLocal<=nK
21b20 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d  ey );.  }.  *pAm
21b30 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
21b40 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
21b50 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
21b60 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
21b70 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
21b80 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
21b90 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
21ba0 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
21bb0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
21bc0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
21bd0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
21be0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
21bf0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
21c00 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
21c10 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
21c20 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
21c30 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
21c40 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
21c50 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
21c60 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
21c70 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
21c80 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
21c90 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
21ca0 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
21cb0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
21cc0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
21cd0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
21ce0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
21cf0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
21d00 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
21d10 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
21d20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
21d30 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
21d40 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
21d50 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
21d60 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
21d70 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
21d80 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
21d90 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
21da0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
21db0 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
21dc0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
21dd0 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
21de0 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  *p = 0;.  assert
21df0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21e00 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
21e10 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
21e20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21e30 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21e40 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
21e50 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  S(pCur->eState==
21e60 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b  CURSOR_VALID) ){
21e70 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20  .    p = (const 
21e80 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
21e90 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30  ad(pCur, pAmt, 0
21ea0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21eb0 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  p;.}.const void 
21ec0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
21ed0 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
21ee0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
21ef0 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
21f00 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  *p = 0;.  assert
21f10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21f20 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
21f30 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
21f40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21f50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21f60 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
21f70 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  S(pCur->eState==
21f80 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b  CURSOR_VALID) ){
21f90 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20  .    p = (const 
21fa0 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f  void*)fetchPaylo
21fb0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31  ad(pCur, pAmt, 1
21fc0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21fd0 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  p;.}.../*.** Mov
21fe0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
21ff0 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
22000 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
22010 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
22020 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
22030 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
22040 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
22050 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
22060 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
22070 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
22080 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
22090 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
220a0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
220b0 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
220c0 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
220d0 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
220e0 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
220f0 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
22100 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
22110 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
22120 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
22130 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
22140 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
22150 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
22160 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
22170 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
22180 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
22190 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
221a0 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
221b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
221c0 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
221d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
221e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
221f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22200 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22210 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
22220 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
22230 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
22240 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
22250 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
22260 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
22270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22280 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22290 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
222a0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
222b0 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
222c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
222d0 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
222e0 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
222f0 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
22300 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
22310 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
22320 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
22330 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
22340 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
22350 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
22360 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65  ->nCell<1 || pNe
22370 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70  wPage->intKey!=p
22380 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
22390 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
223a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
223b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
223c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
223d0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
223e0 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
223f0 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
22400 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
22410 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
22420 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
22430 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
22440 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
22450 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
22460 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
22470 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
22480 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
22490 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
224a0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
224b0 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
224c0 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
224d0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
224e0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
224f0 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
22500 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
22510 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
22520 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
22530 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
22540 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
22550 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
22560 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
22570 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
22580 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
22590 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
225a0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
225b0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
225c0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
225d0 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
225e0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
225f0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
22600 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
22610 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
22620 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
22630 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
22640 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
22650 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
22660 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
22670 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
22680 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
22690 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
226a0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
226b0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
226c0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
226d0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
226e0 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
226f0 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
22700 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
22710 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
22720 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
22730 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
22740 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
22750 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
22760 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
22770 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
22780 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
22790 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
227a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
227b0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
227c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
227d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
227e0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
227f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22800 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22810 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
22820 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
22830 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22840 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
22850 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22860 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
22870 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22880 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
22890 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61    );.  releasePa
228a0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
228b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
228c0 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
228d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
228e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
228f0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d  validNKey = 0;.}
22900 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
22910 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
22920 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
22930 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
22940 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
22950 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
22960 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
22970 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
22980 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
22990 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
229a0 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
229b0 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
229c0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
229d0 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
229e0 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
229f0 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
22a00 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
22a10 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
22a20 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
22a30 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
22a40 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
22a50 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
22a60 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
22a70 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
22a80 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
22a90 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
22aa0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
22ab0 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
22ac0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
22ad0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
22ae0 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
22af0 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
22b00 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
22b10 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
22b20 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
22b30 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
22b40 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
22b50 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
22b60 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
22b70 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
22b80 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
22b90 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
22ba0 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
22bb0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
22bc0 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
22bd0 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
22be0 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
22bf0 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
22c00 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
22c10 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
22c20 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
22c30 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
22c40 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
22c50 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
22c60 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
22c70 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
22c80 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
22c90 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
22ca0 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
22cb0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
22cc0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
22cd0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
22ce0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
22cf0 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
22d00 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
22d10 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
22d20 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
22d30 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
22d40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
22d50 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
22d60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22d70 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70  E_OK;.  Btree *p
22d80 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
22d90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
22da0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
22db0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22dc0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22dd0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
22de0 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
22df0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
22e00 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
22e10 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
22e20 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
22e30 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
22e40 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
22e50 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
22e60 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
22e70 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
22e80 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
22e90 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
22ea0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
22eb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22ec0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
22ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
22ee0 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
22ef0 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
22f00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22f10 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
22f20 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
22f30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
22f40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
22f50 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72  for(i=1; i<=pCur
22f60 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
22f70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22f80 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
22f90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
22fa0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
22fb0 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
22fc0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
22fd0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
22fe0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22ff0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23000 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
23010 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
23020 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
23030 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
23040 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
23050 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23070 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
23080 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
23090 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
230a0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
230b0 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  iPage = 0;..    
230c0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
230d0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
230e0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
230f0 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
23100 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  is cursor.    **
23110 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
23120 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
23130 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
23140 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
23150 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20  is.    ** NULL, 
23160 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
23170 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
23180 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
23190 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20  t the case,.    
231a0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
231b0 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
231c0 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  r.  */.    asser
231d0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
231e0 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  0]->intKey==1 ||
231f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23200 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
23210 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b     if( (pCur->pK
23220 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72  eyInfo==0)!=pCur
23230 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
23240 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
23250 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23260 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
23270 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20   }..  /* Assert 
23280 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61  that the root pa
23290 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ge is of the cor
232a0 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20  rect type. This 
232b0 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a  must be the.  **
232c0 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c   case as the cal
232d0 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
232e0 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74  on that loaded t
232f0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69  he root-page (ei
23300 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63  ther.  ** this c
23310 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75  all or a previou
23320 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f  s invocation) wo
23330 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
23340 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20  d corruption .  
23350 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70  ** if the assump
23360 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
23370 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  ue, and it is no
23380 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
23390 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62  he flags .  ** b
233a0 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e  yte to have been
233b0 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20   modified while 
233c0 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68  this cursor is h
233d0 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
233e0 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  ce.  ** to the p
233f0 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74  age.  */.  pRoot
23400 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
23410 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
23420 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
23430 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61  >pgnoRoot );.  a
23440 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
23450 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70  Init && (pCur->p
23460 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f  KeyInfo==0)==pRo
23470 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ot->intKey );.. 
23480 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
23490 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
234a0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
234b0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
234c0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
234d0 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
234e0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
234f0 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
23500 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
23510 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
23520 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
23530 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23540 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
23550 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
23560 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
23570 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
23580 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
23590 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
235a0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
235b0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
235c0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
235d0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
235e0 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
235f0 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
23600 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
23610 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
23620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23630 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23640 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
23650 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
23660 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
23670 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
23680 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
23690 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
236a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
236b0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
236c0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
236d0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
236e0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
236f0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
23700 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
23710 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
23720 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
23730 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23740 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
23750 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
23760 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23770 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23780 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23790 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
237a0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
237b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
237c0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
237d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
237e0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
237f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23800 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23810 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23820 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
23830 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
23840 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
23850 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
23860 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
23870 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
23880 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
23890 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
238a0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
238b0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
238c0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
238d0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
238e0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
238f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
23900 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
23910 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
23920 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
23930 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
23940 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
23950 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
23960 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
23970 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
23980 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
23990 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
239a0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
239b0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
239c0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
239d0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
239e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
239f0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
23a00 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
23a10 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
23a20 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
23a30 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
23a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23a50 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
23a60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23a70 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
23a80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23a90 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
23aa0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
23ab0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23ac0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23ad0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23ae0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23af0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
23b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23b10 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
23b20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23b30 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
23b40 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
23b50 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
23b60 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
23b70 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
23b80 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23b90 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
23ba0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
23bb0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
23bc0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
23bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23be0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
23bf0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
23c00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
23c10 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
23c20 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
23c30 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
23c40 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
23c50 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
23c60 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
23c70 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
23c80 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
23c90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
23ca0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
23cb0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
23cc0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
23cd0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
23ce0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
23cf0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
23d00 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
23d10 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
23d20 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
23d30 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
23d40 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
23d50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
23d60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23d70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23d80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23d90 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
23da0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
23db0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
23dc0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
23dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23de0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
23df0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
23e00 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
23e10 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
23e20 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
23e30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23e40 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
23e50 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
23e60 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
23e70 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23e80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23e90 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
23ea0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
23eb0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
23ec0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
23ed0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
23ee0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23ef0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23f00 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
23f10 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
23f20 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
23f30 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
23f40 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
23f50 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
23f60 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
23f70 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
23f80 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
23f90 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
23fa0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
23fb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
23fc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23fd0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
23fe0 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
23ff0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24000 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24010 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24020 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
24030 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
24040 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
24050 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
24060 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
24070 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
24080 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
24090 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
240a0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
240b0 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74   && pCur->atLast
240c0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
240d0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
240e0 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
240f0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
24100 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
24110 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
24120 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
24130 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
24140 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
24150 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
24160 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
24170 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
24180 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24190 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
241a0 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
241b0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
241c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
241d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
241e0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
241f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24200 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
24210 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
24220 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
24230 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
24240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24250 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
24260 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
24270 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
24280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
24290 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
242a0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
242b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
242c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
242d0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
242e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
242f0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
24300 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
24310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
24320 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24330 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24340 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
24350 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
24360 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
24370 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72  Cur);.      pCur
24380 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53  ->atLast = rc==S
24390 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20  QLITE_OK ?1:0;. 
243a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
243b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
243c0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
243d0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
243e0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
243f0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
24400 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
24410 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
24420 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
24430 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
24440 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
24450 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
24460 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
24470 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
24480 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
24490 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
244a0 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
244b0 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
244c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
244d0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
244e0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
244f0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
24500 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
24510 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
24520 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
24530 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
24540 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
24550 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
24560 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
24570 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
24580 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
24590 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
245a0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
245b0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
245c0 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
245d0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
245e0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
245f0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
24600 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
24610 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
24620 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
24630 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
24640 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
24650 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
24660 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
24670 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
24680 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
24690 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
246a0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246c0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
246d0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
246e0 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
246f0 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
24700 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
24710 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
24720 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
24730 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
24740 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
24750 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
24760 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
24770 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
24780 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
24790 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
247a0 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
247b0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
247c0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
247d0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
247e0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
247f0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
24810 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
24820 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
24830 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24840 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
24850 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
24860 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
24870 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
24880 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
24890 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
248a0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
248b0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
248c0 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
248d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
248e0 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
248f0 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
24900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
24910 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
24920 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
24930 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
24940 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
24950 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
24960 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
24970 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
24980 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
24990 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
249a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
249b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
249c0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
249d0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
249e0 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
249f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
24a00 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
24a10 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
24a20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
24a30 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
24a40 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
24a50 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
24a60 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
24a70 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
24a80 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
24a90 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
24aa0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
24ab0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24ac0 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64  D && pCur->valid
24ad0 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72  NKey .   && pCur
24ae0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
24af0 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
24b00 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
24b10 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
24b20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24b30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24b40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
24b50 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  if( pCur->atLast
24b60 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
24b70 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
24b80 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
24b90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24ba0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24bb0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
24bc0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
24bd0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
24be0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
24bf0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
24c00 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
24c10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24c20 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
24c30 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
24c40 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
24c50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24c60 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
24c70 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24c80 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
24c90 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
24ca0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24cb0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
24cc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24cd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
24ce0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
24cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
24d00 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
24d10 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
24d20 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24d30 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
24d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24d50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
24d60 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
24d70 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
24d80 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
24d90 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
24da0 69 64 78 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  idx;.    Pgno ch
24db0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
24dc0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
24dd0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24de0 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b  age];.    int c;
24df0 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
24e00 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
24e10 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
24e20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
24e30 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
24e40 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
24e50 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
24e60 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
24e70 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
24e80 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
24e90 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
24ea0 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
24eb0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
24ec0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
24ed0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
24ee0 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
24ef0 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
24f00 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
24f10 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
24f20 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
24f30 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
24f40 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
24f50 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
24f60 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
24f70 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
24f80 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
24f90 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
24fa0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
24fb0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
24fc0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
24fd0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
24fe0 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
24ff0 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
25000 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
25010 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
25020 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
25030 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
25040 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
25050 75 31 36 29 28 69 64 78 20 3d 20 75 70 72 29 3b  u16)(idx = upr);
25060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25070 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
25080 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
25090 36 29 28 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  6)(idx = (upr+lw
250a0 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
250b0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
250c0 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  u8 *pCell;      
250d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
250f0 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  o current cell i
25100 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20  n pPage */..    
25110 20 20 61 73 73 65 72 74 28 20 69 64 78 3d 3d 70    assert( idx==p
25120 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25130 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 20  >iPage] );.     
25140 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25150 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65  e = 0;.      pCe
25160 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
25170 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
25180 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
25190 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
251a0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
251b0 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
251c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
251d0 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
251e0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75            u32 du
251f0 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mmy;.          p
25200 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e  Cell += getVarin
25210 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79  t32(pCell, dummy
25220 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25230 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
25240 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
25250 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
25260 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  if( nCellKey==in
25270 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
25280 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
25290 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c   }else if( nCell
252a0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
252b0 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a          c = -1;.
252c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
252d0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
252e0 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
252f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
25300 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
25310 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61          pCur->va
25320 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
25330 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
25340 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
25350 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78        /* The max
25370 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70  imum supported p
25380 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33  age-size is 6553
25390 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65  6 bytes. This me
253a0 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  ans that.       
253b0 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   ** the maximum 
253c0 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  number of record
253d0 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
253e0 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65   an index B-Tree
253f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
25400 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36   is less than 16
25410 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61  384 bytes and ma
25420 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61  y be stored as a
25430 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20   2-byte.        
25440 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20  ** varint. This 
25450 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
25460 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74  sed to attempt t
25470 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20  o avoid parsing 
25480 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
25490 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63  entire cell by c
254a0 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20  hecking for the 
254b0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
254c0 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20  record is .     
254d0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74     ** stored ent
254e0 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65  irely within the
254f0 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20   b-tree page by 
25500 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66  inspecting the f
25510 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  irst .        **
25520 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   2 bytes of the 
25530 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f  cell..        */
25540 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
25550 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
25560 20 20 20 20 20 20 20 69 66 28 20 21 28 6e 43 65         if( !(nCe
25570 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20 6e 43  ll & 0x80) && nC
25580 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ell<=pPage->maxL
25590 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
255a0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
255b0 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63   runs if the rec
255c0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  ord-size field o
255d0 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a  f the cell is a.
255e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
255f0 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20  gle byte varint 
25600 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66  and the record f
25610 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
25620 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20  the main.       
25630 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67     ** b-tree pag
25640 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
25650 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
25660 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
25670 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
25680 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
25690 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
256a0 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
256b0 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
256c0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
256d0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
256e0 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
256f0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
25700 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
25710 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
25720 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
25730 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
25740 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
25750 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
25760 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
25770 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
25780 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
25790 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
257a0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
257b0 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
257c0 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
257d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
257e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
257f0 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
25800 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
25810 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
25820 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
25830 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
25840 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
25850 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
25860 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
25870 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
25880 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
25890 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
258a0 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
258b0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
258c0 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
258d0 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
258e0 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
258f0 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
25900 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
25910 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
25920 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
25930 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
25940 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
25950 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
25960 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
25970 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
25980 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
25990 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
259a0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
259b0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
259c0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
259d0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
259e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
259f0 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
25a00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25a10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
25a20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
25a30 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
25a40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25a50 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
25a60 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
25a70 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
25a80 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
25a90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
25aa0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
25ab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25ac0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
25ad0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
25ae0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
25af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25b00 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
25b10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
25b20 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
25b30 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
25b40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25b50 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
25b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
25b70 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
25b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
25b90 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
25ba0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25bb0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
25bc0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  x;.          bre
25bd0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
25be0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
25bf0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
25c00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25c10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25c20 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25c40 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
25c50 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
25c60 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
25c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
25c80 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
25c90 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
25ca0 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
25cb0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25cc0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
25cd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
25ce0 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77 72 2b  u16)(idx = (lwr+
25cf0 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  upr)/2);.    }. 
25d00 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
25d10 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d  upr+1 || (pPage-
25d20 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
25d30 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20  e->leaf) );.    
25d40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
25d50 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
25d60 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
25d70 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
25d80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25d90 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
25da0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
25db0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
25dc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
25dd0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
25de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25df0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
25e00 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
25e10 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
25e20 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
25e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
25e40 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25e50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
25e60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25e70 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
25e80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
25e90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
25ea0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
25eb0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
25ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
25ed0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25ee0 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
25ef0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
25f00 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
25f10 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
25f20 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
25f30 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
25f40 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
25f50 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
25f60 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76  _finish;.  }.mov
25f70 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65  eto_finish:.  re
25f80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
25f90 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
25fa0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
25fb0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
25fc0 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
25fd0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
25fe0 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
25ff0 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
26000 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
26010 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
26020 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
26030 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
26040 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
26050 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
26060 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
26070 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
26080 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
26090 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
260a0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
260b0 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
260c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
260d0 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
260e0 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
260f0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
26100 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
26110 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
26120 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
26130 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
26140 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
26150 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
26160 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
26170 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
26180 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
26190 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
261a0 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
261b0 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
261c0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
261d0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
261e0 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  xt entry in the 
261f0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
26200 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
26210 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
26220 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
26230 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
26240 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
26250 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
26260 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
26270 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
26280 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
26290 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
262a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
262b0 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
262c0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
262d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
262e0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
262f0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
26300 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26310 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
26320 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
26330 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
26340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26350 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
26360 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
26370 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
26380 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
26390 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
263a0 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
263b0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
263c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
263d0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
263e0 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  xt>0 ){.    pCur
263f0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
26400 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
26410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26420 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
26430 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a  >skipNext = 0;..
26440 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
26450 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26460 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
26470 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26480 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
26490 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
264a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
264b0 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
264c0 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
264d0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
264e0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
264f0 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
26500 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
26510 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
26520 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
26530 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
26540 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
26550 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
26560 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
26570 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
26580 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26590 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
265a0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
265b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
265c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
265d0 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
265e0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
265f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
26600 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
26610 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
26620 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
26630 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26650 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
26660 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
26670 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
26680 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26690 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
266a0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
266b0 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
266c0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
266d0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
266e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
266f0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
26700 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
26710 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
26720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
26730 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26740 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
26750 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
26760 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
26770 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
26780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26790 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
267a0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
267b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
267c0 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
267d0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
267e0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
267f0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
26800 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
26810 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
26820 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
26830 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
26840 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
26850 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
26860 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
26870 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
26880 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
26890 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
268a0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
268b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
268c0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
268d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
268e0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
268f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26900 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26910 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26920 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
26930 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
26940 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
26950 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
26970 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
26980 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
26990 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
269a0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
269b0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
269c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
269d0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
269e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
269f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
26a00 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
26a10 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
26a20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26a30 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
26a40 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
26a50 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26a60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
26a70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26a80 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
26a90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
26aa0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
26ab0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26ac0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
26ad0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
26ae0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
26af0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
26b00 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
26b10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
26b20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
26b30 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
26b40 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
26b50 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
26b60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26b70 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
26b80 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
26b90 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
26ba0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
26bb0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
26bc0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
26bd0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26bf0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
26c00 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
26c10 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
26c20 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26c30 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
26c40 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
26c50 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26c60 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
26c70 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26c80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
26c90 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
26ca0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
26cb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
26cc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
26cd0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
26ce0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
26cf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26d00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
26d10 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
26d20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26d30 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
26d40 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
26d50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26d60 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
26d70 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
26d80 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
26d90 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
26da0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
26db0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26dc0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
26dd0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
26de0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
26df0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
26e00 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
26e10 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
26e20 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
26e30 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
26e40 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
26e50 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
26e60 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
26e70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
26e80 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
26e90 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
26ea0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
26eb0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
26ec0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
26ed0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
26ee0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
26ef0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
26f00 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
26f10 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
26f20 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
26f30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
26f40 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
26f50 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
26f60 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
26f70 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
26f80 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
26f90 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
26fa0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
26fb0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
26fc0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
26fd0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
26fe0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
26ff0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
27000 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
27010 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
27020 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
27030 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
27040 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
27050 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
27060 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
27070 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
27080 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
27090 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
270a0 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
270b0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
270c0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
270d0 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
270e0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
270f0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
27100 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
27110 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
27120 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
27130 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
27140 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
27150 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
27160 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
27170 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
27180 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
27190 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
271a0 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
271b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
271c0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
271d0 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
271e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
271f0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
27200 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
27210 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
27220 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
27230 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
27240 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
27250 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
27260 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
27270 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
27280 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
27290 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
272a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
272b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
272c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
272d0 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
272e0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
272f0 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
27300 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
27310 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
27320 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27330 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
27340 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
27350 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
27360 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27370 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27380 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
27390 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
273a0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
273b0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
273c0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
273d0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
273e0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
273f0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
27400 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
27410 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
27420 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
27430 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
27440 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
27450 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
27460 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
27470 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
27480 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
27490 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
274a0 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
274b0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
274c0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
274d0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
274e0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
274f0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
27500 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
27510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27520 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
27530 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
27540 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
27550 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
27560 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
27570 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
27580 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
27590 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
275a0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
275b0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
275c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
275d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
275e0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
275f0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
27600 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
27610 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
27620 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
27630 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
27640 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
27650 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
27660 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
27670 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
27680 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
27690 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
276a0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
276b0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
276c0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
276d0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
276e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
276f0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
27700 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
27710 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27720 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
27730 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
27740 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
27750 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
27760 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
27770 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
27780 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
27790 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
277a0 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
277b0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
277c0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
277d0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
277e0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
277f0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
27800 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
27810 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
27820 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
27830 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
27840 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
27850 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
27860 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
27870 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
27880 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
27890 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
278a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
278b0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
278c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
278d0 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
278e0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
278f0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
27900 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
27910 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
27920 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
27930 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
27940 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
27950 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
27960 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
27970 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27980 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
27990 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
279a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
279b0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
279c0 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
279d0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
279e0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
279f0 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ta!=0 );..      
27a00 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
27a10 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
27a20 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20   /* # of leaves 
27a30 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  on this trunk pa
27a40 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
27a50 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
27a60 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
27a70 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
27a80 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
27a90 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
27aa0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
27ab0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
27ac0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
27ad0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
27ae0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
27af0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
27b00 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
27b10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27b20 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
27b30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
27b40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27b50 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
27b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27b70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
27b80 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27b90 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27ba0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
27bb0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
27bc0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
27bd0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
27be0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
27bf0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
27c00 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
27c10 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
27c20 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
27c30 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
27c40 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
27c50 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
27c60 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
27c70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
27c80 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
27c90 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
27ca0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
27cb0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
27cc0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
27cd0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
27ce0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27cf0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
27d00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27d10 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27d20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27d30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
27d40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
27d50 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
27d60 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
27d70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
27d80 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
27d90 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
27da0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
27db0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
27dc0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
27dd0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
27de0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
27df0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27e00 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
27e10 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
27e20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
27e30 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
27e40 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
27e50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27e60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27e70 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
27e80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
27e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
27ea0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
27eb0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
27ec0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
27ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
27ee0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
27ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
27f00 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
27f10 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
27f20 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
27f30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
27f40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27f60 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
27f70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27f80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27fa0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27fb0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27fd0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
27fe0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
27ff0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
28000 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
28010 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28030 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
28040 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
28050 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
28060 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
28070 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
28080 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
28090 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
280a0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
280b0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
280c0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
280d0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
280e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
280f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
28100 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
28110 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
28120 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
28130 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
28140 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
28150 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
28160 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28170 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
28180 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
28190 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
281a0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
281b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
281c0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
281d0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
281e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
281f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
28200 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
28210 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
28220 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28240 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28250 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
28260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28280 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
28290 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
282a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
282b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
282c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
282d0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
282e0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
282f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
28300 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
28310 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
28320 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
28330 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
28340 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
28350 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
28360 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
28370 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
28380 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28390 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
283a0 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
283b0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
283c0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
283d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
283e0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
283f0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
28400 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
28410 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28420 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28430 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
28440 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
28450 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
28460 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
28470 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
28480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28490 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
284a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
284b0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
284c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
284d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
284e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
284f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
28500 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28510 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
28520 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
28530 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
28540 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
28550 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28560 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
28570 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
28580 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
28590 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
285a0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
285b0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
285c0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
285d0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
285e0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
285f0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
28600 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
28610 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
28620 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
28630 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
28640 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
28650 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
28660 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
28670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
28680 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
28690 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
286a0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
286b0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
286c0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
286d0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
286e0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
286f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
28700 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
28710 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
28720 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
28730 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
28740 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
28750 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
28760 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
28770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
28780 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
28790 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
287a0 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
287b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
287c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
287d0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
287e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
287f0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
28800 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
28810 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
28820 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28830 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
28840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
28850 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
28860 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28870 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28880 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
28890 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
288a0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
288b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
288c0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
288d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
288e0 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
288f0 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
28900 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
28910 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
28920 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
28930 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
28940 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
28950 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
28960 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28980 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
28990 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
289a0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
289b0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
289c0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
289d0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
289e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
289f0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
28a00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28a10 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
28a20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
28a30 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
28a40 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
28a50 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
28a60 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
28a70 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
28a80 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
28a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28aa0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
28ab0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
28ac0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
28ad0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
28ae0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
28af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
28b00 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
28b10 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
28b20 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
28b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28b50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28b60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28b70 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
28b80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28b90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28bb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28bc0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
28bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28bf0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
28c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28c10 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
28c20 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
28c30 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
28c40 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
28c50 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
28c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
28c70 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
28c80 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
28c90 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
28ca0 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
28cb0 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
28cc0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
28cd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28ce0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
28cf0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
28d00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
28d10 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
28d20 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
28d30 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
28d40 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28d50 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
28d60 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
28d70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28d80 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
28d90 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
28da0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
28db0 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
28dc0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
28dd0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
28de0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
28df0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
28e00 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
28e10 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
28e20 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
28e30 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
28e40 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
28e50 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
28e60 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
28e70 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
28e80 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
28e90 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
28ea0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
28eb0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
28ec0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
28ed0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
28ee0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
28ef0 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
28f00 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
28f10 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
28f20 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
28f30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
28f40 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
28f50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
28f60 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
28f70 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
28f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28f90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28fa0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28fb0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
28fc0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
28fd0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
28fe0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
28ff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
29000 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
29010 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
29020 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
29030 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
29040 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
29050 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
29060 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
29070 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
29080 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
29090 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
290a0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
290b0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
290c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
290d0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
290e0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
290f0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
29100 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  age, 1);.    if(
29110 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29120 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
29130 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
29140 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
29150 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29170 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
29180 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
29190 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
291a0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
291b0 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
291c0 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
291d0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
291e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
291f0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
29200 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
29210 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
29220 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
29230 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
29240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29250 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
29260 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
29270 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
29280 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
29290 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
292a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
292b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
292c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
292d0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
292e0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
292f0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
29300 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
29310 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
29320 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
29330 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
29340 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
29350 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29360 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
29370 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
29380 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
29390 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
293a0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
293b0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
293c0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
293d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
293e0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
293f0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
29400 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
29410 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
29420 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
29430 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
29440 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
29450 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
29460 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
29470 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
29480 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
29490 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
294a0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
294b0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
294c0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
294d0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
294e0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
294f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
29500 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
29510 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
29520 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
29530 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
29540 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
29550 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
29560 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
29570 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
29580 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
29590 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
295a0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
295b0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
295c0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
295d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295e0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
295f0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
29600 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29620 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
29630 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
29640 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
29650 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
29660 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
29670 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
29680 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
29690 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
296a0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
296b0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
296c0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
296d0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
296e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
29710 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
29720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29740 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
29750 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
29760 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
29770 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29780 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
29790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
297a0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
297b0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
297c0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
297d0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
297e0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
297f0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
29800 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
29810 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
29820 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
29830 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
29840 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
29850 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
29860 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
29870 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
29880 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
29890 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
298a0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
298b0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
298c0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
298d0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
298e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
298f0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
29900 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
29910 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
29920 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
29930 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
29940 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
29950 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
29960 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
29970 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
29980 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
29990 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
299a0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
299b0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
299c0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
299d0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
299e0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
299f0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
29a00 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
29a10 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
29a20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29a30 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
29a40 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
29a50 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29a60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
29a70 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
29a80 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
29a90 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
29aa0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
29ab0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
29ac0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
29ad0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
29ae0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
29af0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
29b00 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
29b10 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
29b20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
29b30 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
29b40 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
29b50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
29b60 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
29b70 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
29b80 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
29b90 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
29ba0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
29bb0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
29bc0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
29bd0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
29be0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
29bf0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
29c00 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
29c10 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
29c20 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
29c30 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
29c40 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
29c50 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
29c60 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
29c70 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
29c80 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
29c90 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
29ca0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
29cb0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
29cc0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
29cd0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
29ce0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
29cf0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
29d00 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
29d10 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
29d20 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
29d30 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
29d40 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
29d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29d60 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
29d70 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
29d80 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
29d90 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
29da0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
29db0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
29dc0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
29dd0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
29de0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
29df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
29e10 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29e20 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
29e30 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
29e40 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
29e50 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
29e60 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
29e70 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
29e80 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
29e90 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
29ea0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29eb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29ec0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
29ed0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
29ee0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
29ef0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
29f00 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
29f10 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
29f20 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
29f30 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
29f40 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
29f50 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
29f60 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
29f70 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
29f80 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
29f90 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
29fa0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
29fb0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
29fc0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
29fd0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
29fe0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
29ff0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2a000 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2a010 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2a020 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2a030 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2a040 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2a050 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2a060 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2a070 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2a080 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2a090 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2a0a0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2a0b0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2a0c0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2a0d0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2a0e0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2a0f0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2a100 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2a110 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2a120 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2a130 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2a140 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2a150 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2a160 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2a170 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2a180 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2a190 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2a1a0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2a1b0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2a1c0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2a1d0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2a1e0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2a1f0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2a200 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2a210 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2a220 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2a230 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2a240 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2a250 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2a260 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2a270 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a280 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2a290 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2a2a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a2b0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2a2c0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2a2d0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2a2e0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2a2f0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2a300 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2a310 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2a320 20 70 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e   pPage && !pBt->
2a330 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
2a340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a350 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a360 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2a370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a380 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
2a390 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2a3a0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
2a3b0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
2a3c0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
2a3d0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
2a3e0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
2a3f0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
2a400 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2a410 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2a420 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
2a430 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
2a440 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
2a450 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
2a460 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
2a470 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
2a480 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
2a490 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
2a4a0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2a4b0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
2a4c0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
2a4d0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
2a4e0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
2a4f0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2a500 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
2a510 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2a520 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
2a530 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
2a540 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
2a550 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
2a560 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
2a570 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2a580 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
2a590 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
2a5a0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
2a5b0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2a5c0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2a5d0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
2a5e0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2a5f0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2a600 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a610 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2a620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a630 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2a640 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2a650 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2a660 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2a670 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2a680 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2a690 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2a6a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2a6b0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2a6c0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2a6d0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2a6e0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2a6f0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2a700 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2a710 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2a720 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2a730 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2a740 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2a750 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2a760 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2a770 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a780 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2a790 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2a7a0 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2a7b0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2a7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2a7d0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2a7e0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2a7f0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2a800 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2a810 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2a820 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2a830 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2a840 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
2a850 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
2a860 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
2a870 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2a880 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
2a890 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2a8a0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
2a8b0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
2a8c0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
2a8d0 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
2a8e0 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
2a8f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a900 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2a910 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2a920 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
2a930 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2a940 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2a950 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2a960 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
2a970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
2a980 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
2a990 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
2a9a0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
2a9b0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2a9c0 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
2a9d0 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d  rflow+3 > pPage-
2a9e0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
2a9f0 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  skPage ){.    re
2aa00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2aa10 55 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  UPT;  /* Cell ex
2aa20 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
2aa30 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
2aa40 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
2aa50 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2aa60 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
2aa70 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2aa80 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
2aa90 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
2aaa0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2aab0 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
2aac0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
2aad0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
2aae0 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
2aaf0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
2ab00 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
2ab10 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
2ab20 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
2ab30 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
2ab40 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
2ab50 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2ab60 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
2ab70 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
2ab80 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2ab90 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2aba0 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2abb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2abc0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2abd0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2abe0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2abf0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2ac00 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2ac10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2ac20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2ac30 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2ac40 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2ac50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ac60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ac70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2ac80 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2ac90 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2aca0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2acb0 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2acc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2acd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ace0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2acf0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2ad00 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2ad10 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2ad20 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2ad30 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2ad40 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2ad50 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2ad60 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2ad70 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2ad80 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2ad90 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2ada0 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2adb0 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2adc0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2add0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2ade0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2adf0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2ae00 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2ae10 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2ae20 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2ae30 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2ae40 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2ae50 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2ae60 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2ae70 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2ae80 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2ae90 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2aea0 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2aeb0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2aec0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2aed0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2aee0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2aef0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2af00 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2af10 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2af20 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2af30 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2af40 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2af50 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2af60 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2af70 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2af80 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2af90 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2afa0 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2afb0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2afc0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2afd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2afe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2aff0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2b000 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2b010 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2b020 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2b030 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2b040 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2b050 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2b060 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2b070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2b080 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b090 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2b0a0 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2b0b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2b0c0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2b0d0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2b0e0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2b0f0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2b100 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2b110 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2b120 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2b130 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2b140 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2b150 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2b160 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2b170 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2b180 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2b190 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2b1a0 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2b1b0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2b1c0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2b1d0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2b1e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b1f0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2b200 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2b210 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2b220 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2b230 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2b240 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2b250 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2b260 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2b270 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2b280 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2b290 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2b2a0 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2b2b0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2b2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b2d0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2b2e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b300 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2b310 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2b320 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2b330 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2b340 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2b350 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2b360 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2b370 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2b380 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2b390 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2b3a0 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2b3b0 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2b3c0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2b3f0 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2b400 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2b410 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b430 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2b440 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2b450 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2b460 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2b470 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2b480 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2b490 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2b4a0 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2b4b0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2b4c0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2b4d0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2b4e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2b4f0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2b500 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2b510 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2b520 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2b530 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2b540 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2b550 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b560 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2b570 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2b580 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2b590 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2b5a0 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2b5b0 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2b5c0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2b5d0 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2b5e0 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2b5f0 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2b600 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2b610 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2b620 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2b630 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2b640 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2b650 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2b660 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b670 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2b680 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2b690 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2b6a0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2b6b0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2b6c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2b6d0 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2b6e0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2b6f0 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2b700 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2b710 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2b720 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
2b730 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
2b740 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
2b750 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
2b760 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
2b770 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
2b780 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65  )&nKey);.  btree
2b790 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2b7a0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2b7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2b7c0 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
2b7d0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2b7e0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
2b7f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2b800 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
2b810 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
2b820 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
2b830 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
2b840 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
2b850 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
2b860 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2b870 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2b880 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2b890 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2b8a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2b8b0 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2b8c0 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2b8d0 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2b8e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b8f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b900 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2b910 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
2b920 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
2b930 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
2b940 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
2b950 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
2b960 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
2b970 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
2b980 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
2b990 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
2b9a0 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
2b9b0 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
2b9c0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2b9d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2b9e0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2b9f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ba00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2ba10 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2ba20 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2ba30 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2ba40 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2ba50 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2ba60 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2ba70 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2ba80 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2ba90 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2baa0 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2bab0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2bac0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2bad0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2bae0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2baf0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2bb00 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2bb10 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2bb20 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2bb30 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2bb40 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2bb50 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2bb60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2bb70 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2bb80 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2bb90 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2bba0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2bbb0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2bbc0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2bbd0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2bbe0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2bbf0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2bc00 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2bc10 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2bc20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2bc30 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2bc40 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2bc50 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2bc60 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2bc70 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2bc80 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2bc90 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2bca0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2bcb0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2bcc0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2bcd0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2bce0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2bcf0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2bd00 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2bd10 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2bd20 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2bd30 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
2bd40 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2bd50 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2bd60 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2bd70 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2bd80 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2bd90 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2bda0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bdb0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2bdc0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2bdd0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2bde0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2bdf0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2be00 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2be10 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2be20 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2be30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2be40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2be50 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2be60 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2be70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2be80 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2be90 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2bea0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2beb0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2bec0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2bed0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2bee0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2bef0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2bf00 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2bf10 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2bf20 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2bf30 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2bf40 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2bf50 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2bf60 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2bf70 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2bf80 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2bf90 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2bfa0 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2bfb0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2bfc0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2bfd0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2bfe0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2bff0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2c000 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2c010 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2c020 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2c030 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2c040 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2c050 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2c060 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c070 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2c080 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2c090 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2c0a0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2c0b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2c0c0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2c0d0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2c0e0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2c0f0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2c100 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2c110 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2c120 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2c130 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2c140 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2c150 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2c160 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2c170 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2c180 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2c190 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2c1a0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2c1b0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2c1c0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2c1d0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2c1e0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2c1f0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2c200 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2c210 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2c220 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2c230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
2c240 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2c250 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c260 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2c270 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2c280 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
2c290 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
2c2a0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2c2b0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2c2c0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
2c2d0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2c2e0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
2c2f0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
2c300 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
2c310 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
2c320 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2c330 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2c340 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2c350 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c360 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2c370 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
2c380 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
2c390 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
2c3a0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
2c3b0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2c3c0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
2c3d0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2c3e0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
2c3f0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
2c400 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2c410 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
2c420 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
2c430 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
2c440 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
2c450 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
2c460 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
2c470 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2c480 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
2c490 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
2c4a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2c4b0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
2c4c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c4d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2c4e0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
2c4f0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
2c500 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
2c510 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
2c520 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2c530 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
2c540 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
2c550 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
2c560 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
2c570 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
2c580 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
2c590 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2c5a0 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
2c5b0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
2c5c0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
2c5d0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
2c5e0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
2c5f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2c600 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
2c610 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
2c620 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2c630 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
2c640 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
2c650 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
2c660 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2c670 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2c680 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2c690 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2c6a0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2c6b0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2c6c0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2c6d0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2c6e0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2c6f0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2c700 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45  endPtr;     /* E
2c710 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  nd of loop */.  
2c720 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2c730 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2c740 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
2c750 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
2c760 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
2c770 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
2c780 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
2c790 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
2c7a0 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2c7b0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
2c7c0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2c7d0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2c7e0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
2c7f0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
2c800 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c810 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2c820 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2c830 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2c840 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2c850 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2c860 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2c870 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
2c880 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
2c890 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
2c8a0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
2c8b0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
2c8c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2c8d0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
2c8e0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2c8f0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
2c900 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
2c910 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2c920 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
2c930 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
2c940 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
2c950 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
2c960 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2c970 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
2c980 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c990 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
2c9a0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
2c9b0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
2c9c0 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
2c9d0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2c9e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2c9f0 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b   endPtr = &data[
2ca00 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2ca10 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2ca20 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72  ll - 2];.  asser
2ca30 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54  t( (SQLITE_PTR_T
2ca40 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30  O_INT(ptr)&1)==0
2ca50 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61   );  /* ptr is a
2ca60 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69  lways 2-byte ali
2ca70 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28  gned */.  while(
2ca80 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20   ptr<endPtr ){. 
2ca90 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20     *(u16*)ptr = 
2caa0 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a  *(u16*)&ptr[2];.
2cab0 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20      ptr += 2;.  
2cac0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2cad0 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
2cae0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2caf0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2cb00 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2cb10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2cb20 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2cb30 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2cb40 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2cb50 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2cb60 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2cb70 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2cb80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2cb90 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2cba0 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2cbb0 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2cbc0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2cbd0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2cbe0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2cbf0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2cc00 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2cc10 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2cc20 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2cc30 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2cc40 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2cc50 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  >aOvfl[] and mak
2cc60 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
2cc70 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
2cc80 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
2cc90 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
2cca0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
2ccb0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
2ccc0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
2ccd0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
2cce0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
2ccf0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
2cd00 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
2cd10 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
2cd20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
2cd30 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2cd40 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
2cd50 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
2cd60 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
2cd70 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
2cd80 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
2cd90 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
2cda0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2cdb0 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
2cdc0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2cdd0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
2cde0 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
2cdf0 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
2ce00 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
2ce10 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
2ce20 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
2ce30 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
2ce40 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2ce50 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
2ce60 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
2ce70 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
2ce80 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
2ce90 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
2cea0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
2ceb0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
2cec0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
2ced0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2cee0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
2cef0 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
2cf00 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2cf10 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
2cf20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
2cf30 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
2cf40 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
2cf50 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
2cf60 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
2cf70 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
2cf80 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
2cf90 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
2cfa0 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
2cfb0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2cfc0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
2cfd0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
2cfe0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
2cff0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2d000 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
2d010 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
2d020 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
2d030 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2d040 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2d050 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d060 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2d070 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2d080 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2d090 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2d0a0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2d0b0 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2d0c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2d0d0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2d0e0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2d0f0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2d100 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2d110 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2d120 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2d130 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2d140 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2d150 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2d160 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2d170 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
2d180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2d190 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
2d1a0 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
2d1b0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
2d1c0 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20  8 *endPtr;      
2d1d0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2d1e0 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53  oop */..  int nS
2d1f0 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20  kip = (iChild ? 
2d200 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a  4 : 0);..  if( *
2d210 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2d220 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2d230 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2d240 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2d250 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2d260 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2d270 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2d280 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2d290 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
2d2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d2b0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
2d2c0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2d2d0 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
2d2e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d2f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2d300 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
2d310 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
2d320 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
2d330 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
2d340 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
2d350 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
2d360 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
2d370 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
2d380 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
2d390 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
2d3a0 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
2d3b0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
2d3c0 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
2d3d0 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
2d3e0 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
2d3f0 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
2d400 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
2d410 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
2d420 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
2d430 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
2d440 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
2d450 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
2d460 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
2d470 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
2d480 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2d490 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
2d4a0 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
2d4b0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
2d4c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
2d4d0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
2d4e0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
2d4f0 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
2d500 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
2d510 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
2d520 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
2d530 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
2d540 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
2d550 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2d560 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
2d570 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
2d580 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2d590 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
2d5a0 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
2d5b0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
2d5c0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
2d5d0 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
2d5e0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
2d5f0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
2d600 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
2d610 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a  ].idx = (u16)i;.
2d620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
2d630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d640 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2d650 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2d660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d670 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
2d680 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
2d690 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2d6a0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2d6b0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2d6c0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2d6d0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2d6e0 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f  aData;.    cellO
2d6f0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
2d700 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
2d710 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
2d720 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
2d730 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
2d740 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
2d750 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
2d760 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
2d770 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
2d780 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
2d790 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
2d7a0 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
2d7b0 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
2d7c0 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
2d7d0 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72  owing two proper
2d7e0 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
2d7f0 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
2d800 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
2d810 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b   idx >= end+2 );
2d820 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2d830 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
2d840 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2d850 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
2d860 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
2d870 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
2d880 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
2d890 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
2d8a0 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
2d8b0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2d8c0 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
2d8d0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2d8e0 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
2d8f0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2d900 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e    ptr = &data[en
2d910 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d  d];.    endPtr =
2d920 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20   &data[ins];.   
2d930 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
2d940 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29  _PTR_TO_INT(ptr)
2d950 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74  &1)==0 );  /* pt
2d960 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79  r is always 2-by
2d970 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20  te aligned */.  
2d980 20 20 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64    while( ptr>end
2d990 50 74 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75  Ptr ){.      *(u
2d9a0 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a  16*)ptr = *(u16*
2d9b0 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  )&ptr[-2];.     
2d9c0 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d   ptr -= 2;.    }
2d9d0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2d9e0 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
2d9f0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2da00 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2da10 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
2da20 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2da30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2da40 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2da50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
2da60 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
2da70 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
2da80 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
2da90 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2daa0 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
2dab0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
2dac0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2dad0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
2dae0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
2daf0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2db00 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2db10 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
2db20 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
2db30 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
2db40 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
2db50 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
2db60 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
2db70 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
2db80 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
2db90 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2dba0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
2dbb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2dbc0 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
2dbd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2dbe0 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
2dbf0 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
2dc00 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
2dc10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2dc20 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
2dc30 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
2dc40 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2dc50 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
2dc60 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
2dc70 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
2dc80 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
2dc90 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
2dca0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2dcc0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2dcd0 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
2dce0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2dcf0 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2dd00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2dd10 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2dd20 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2dd30 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2dd40 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2dd50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2dd60 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2dd70 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2dd80 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2dd90 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2dda0 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2ddb0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2ddc0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2ddd0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2dde0 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2ddf0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2de00 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2de10 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2de20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2de30 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2de40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2de50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2de60 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2de70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2de80 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2de90 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2dea0 67 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20  ge->pBt).       
2deb0 20 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f       && (int)MX_
2dec0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2ded0 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65  <=10921);.  asse
2dee0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2def0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2df00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2df10 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2df20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73  the page has jus
2df30 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  t been zeroed by
2df40 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20   zeroPage() */. 
2df50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2df60 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2df70 73 65 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f  sert( get2byteNo
2df80 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
2df90 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a  5])==nUsable );.
2dfa0 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64  .  pCellptr = &d
2dfb0 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
2dfc0 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
2dfd0 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
2dfe0 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
2dff0 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
2e000 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20  --){.    u16 sz 
2e010 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
2e020 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2e030 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73     cellbody -= s
2e040 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  z;.    put2byte(
2e050 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
2e060 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
2e070 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
2e080 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b   apCell[i], sz);
2e090 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
2e0a0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
2e0b0 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
2e0c0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
2e0d0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2e0e0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
2e0f0 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
2e100 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2e110 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
2e120 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
2e130 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2e140 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
2e150 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
2e160 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
2e170 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
2e180 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
2e190 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
2e1a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
2e1b0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2e1c0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
2e1d0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
2e1e0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2e1f0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2e200 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
2e210 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2e220 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
2e230 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
2e240 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
2e250 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
2e260 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2e270 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
2e280 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
2e290 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
2e2a0 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
2e2b0 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
2e2c0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
2e2d0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
2e2e0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
2e2f0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
2e300 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
2e310 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
2e320 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
2e330 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
2e340 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
2e350 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
2e360 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
2e370 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
2e380 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
2e390 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
2e3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e3b0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2e3c0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2e3d0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
2e3e0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
2e3f0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
2e400 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
2e410 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
2e420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e430 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2e440 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
2e450 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
2e460 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
2e470 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
2e480 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
2e490 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
2e4a0 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
2e4b0 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
2e4c0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
2e4d0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
2e4e0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
2e4f0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
2e500 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
2e510 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
2e520 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
2e530 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
2e540 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
2e550 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
2e560 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
2e570 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2e580 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
2e590 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
2e5a0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
2e5b0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
2e5c0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
2e5d0 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
2e5e0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
2e5f0 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
2e600 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
2e610 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
2e620 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
2e630 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
2e640 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
2e650 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
2e660 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
2e670 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
2e680 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
2e690 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
2e6a0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2e6b0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
2e6c0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
2e6d0 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
2e6e0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
2e6f0 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
2e700 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
2e710 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
2e720 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
2e730 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
2e740 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2e750 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
2e760 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
2e770 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
2e780 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
2e790 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
2e7a0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2e7b0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
2e7c0 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
2e7d0 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
2e7e0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
2e7f0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
2e800 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2e810 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
2e820 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
2e830 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
2e840 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2e850 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
2e860 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
2e870 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
2e880 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
2e890 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
2e8a0 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
2e8b0 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
2e8c0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
2e8d0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
2e8e0 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
2e8f0 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
2e900 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
2e910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e920 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
2e930 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2e940 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2e970 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
2e980 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
2e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9a0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2e9b0 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
2e9c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e9d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2e9e0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2e9f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ea00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ea10 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2ea20 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2ea30 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2ea40 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
2ea50 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
2ea60 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
2ea70 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
2ea80 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2ea90 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  n */.  if( pPage
2eaa0 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74  ->nCell<=0 ) ret
2eab0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2eac0 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
2ead0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2eae0 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
2eaf0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
2eb00 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
2eb10 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
2eb20 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2eb30 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
2eb40 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
2eb50 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
2eb60 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
2eb70 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
2eb80 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
2eb90 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
2eba0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
2ebb0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2ebc0 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2ebd0 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
2ebe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ebf0 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
2ec00 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
2ec10 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
2ec20 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
2ec30 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a  Cell;.    u16 sz
2ec40 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
2ec50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2ec60 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
2ec70 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
2ec80 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ec90 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
2eca0 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
2ecb0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
2ecc0 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
2ecd0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2ece0 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
2ecf0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
2ed00 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2ed10 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
2ed20 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2ed30 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
2ed40 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
2ed50 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2ed60 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2ed70 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2ed80 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
2ed90 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
2eda0 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
2edb0 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
2edc0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
2edd0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
2ede0 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
2edf0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2ee00 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
2ee10 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
2ee20 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
2ee30 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
2ee40 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
2ee50 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
2ee60 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
2ee70 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
2ee80 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
2ee90 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
2eea0 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
2eeb0 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
2eec0 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
2eed0 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
2eee0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2eef0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
2ef00 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
2ef10 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
2ef20 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
2ef30 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
2ef40 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2ef50 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2ef60 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2ef70 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
2ef80 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2ef90 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2efa0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
2efb0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
2efc0 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
2efd0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
2efe0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2eff0 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
2f000 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2f010 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
2f020 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
2f030 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
2f040 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
2f050 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
2f060 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2f070 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
2f080 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
2f090 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
2f0a0 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
2f0b0 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
2f0c0 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
2f0d0 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
2f0e0 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
2f0f0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
2f100 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
2f110 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
2f120 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
2f130 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
2f140 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
2f150 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
2f160 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
2f170 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
2f180 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
2f190 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
2f1a0 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
2f1b0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2f1c0 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
2f1d0 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
2f1e0 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
2f1f0 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
2f200 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2f210 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
2f220 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
2f230 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
2f240 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
2f250 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
2f260 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
2f270 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
2f280 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
2f290 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
2f2a0 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
2f2b0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
2f2c0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2f2d0 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
2f2e0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
2f2f0 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
2f300 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2f310 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
2f320 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2f330 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2f340 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
2f350 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2f360 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
2f370 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2f380 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
2f390 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
2f3a0 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
2f3b0 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
2f3c0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
2f3d0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
2f3e0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
2f3f0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
2f400 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
2f410 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
2f420 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
2f430 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
2f440 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
2f450 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
2f460 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
2f470 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
2f480 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
2f490 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2f4a0 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
2f4b0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2f4c0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2f4d0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2f4e0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
2f4f0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
2f500 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
2f510 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
2f520 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
2f530 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2f540 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f550 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2f560 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
2f570 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f580 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
2f590 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
2f5a0 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2f5b0 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
2f5c0 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
2f5d0 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
2f5e0 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
2f5f0 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
2f600 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
2f610 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
2f620 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
2f630 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
2f640 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
2f650 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
2f660 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
2f670 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
2f680 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
2f690 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
2f6a0 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
2f6b0 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
2f6c0 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
2f6d0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2f6e0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
2f6f0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2f700 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
2f710 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
2f720 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
2f730 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
2f740 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
2f750 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
2f760 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
2f770 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2f780 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
2f790 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
2f7a0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
2f7b0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
2f7c0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
2f7d0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2f7e0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2f7f0 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
2f800 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2f810 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2f820 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2f830 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
2f840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f850 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2f860 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2f870 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2f880 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
2f890 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2f8a0 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2f8b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2f8c0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2f8d0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2f8e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f8f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2f900 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
2f910 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2f920 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2f930 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2f940 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
2f950 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2f960 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2f970 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2f980 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2f990 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2f9a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2f9b0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
2f9c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2f9d0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
2f9e0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
2f9f0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
2fa00 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
2fa10 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
2fa20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
2fa30 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
2fa40 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
2fa50 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
2fa60 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
2fa70 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
2fa80 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
2fa90 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
2faa0 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
2fab0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
2fac0 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
2fad0 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
2fae0 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
2faf0 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
2fb00 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
2fb10 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2fb20 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
2fb30 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
2fb40 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
2fb50 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
2fb60 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
2fb70 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
2fb80 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
2fb90 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
2fba0 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
2fbb0 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
2fbc0 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79  ge.aOvfl[] array
2fbd0 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
2fbe0 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
2fbf0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
2fc00 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
2fc10 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
2fc20 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
2fc30 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
2fc40 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
2fc50 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2fc60 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
2fc70 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
2fc80 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
2fc90 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
2fca0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
2fcb0 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
2fcc0 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
2fcd0 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
2fce0 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
2fcf0 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
2fd00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fd10 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
2fd20 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
2fd30 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
2fd40 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2fd50 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2fd60 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
2fd70 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
2fd80 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
2fd90 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
2fda0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
2fdb0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
2fdc0 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
2fdd0 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
2fde0 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
2fdf0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
2fe00 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
2fe10 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
2fe20 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
2fe30 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
2fe40 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
2fe50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
2fe60 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
2fe70 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2fe80 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
2fe90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
2fea0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
2feb0 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
2fec0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
2fed0 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
2fee0 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
2fef0 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
2ff00 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
2ff10 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
2ff20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
2ff30 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
2ff40 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
2ff50 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
2ff60 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
2ff70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
2ff80 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
2ff90 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
2ffa0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
2ffb0 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
2ffc0 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
2ffd0 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
2ffe0 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
2fff0 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
30000 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
30010 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
30020 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
30030 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
30040 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
30050 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
30060 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
30070 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
30080 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
30090 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
300a0 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
300b0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
300c0 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
300d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
300e0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
300f0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
30100 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
30110 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30120 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
30130 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
30140 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
30150 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
30160 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
30170 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
30180 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
30190 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
301a0 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
301b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
301c0 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
301d0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
301e0 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
301f0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
30200 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
30210 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
30220 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
30230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
30240 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
30250 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
30260 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
30270 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
30280 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
30290 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
302a0 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
302b0 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
302c0 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
302d0 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
302e0 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
302f0 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
30300 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
30310 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
30320 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
30330 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
30340 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
30350 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
30360 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
30370 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
30380 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
30390 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
303a0 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
303b0 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
303c0 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
303d0 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
303e0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
303f0 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
30400 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
30410 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
30420 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
30430 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
30440 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
30450 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
30460 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
30470 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
30480 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
30490 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
304a0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
304b0 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
304c0 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
304d0 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
304e0 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
304f0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
30500 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
30510 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
30520 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
30530 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
30540 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
30550 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
30560 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
30570 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
30580 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
30590 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
305a0 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
305b0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
305c0 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
305d0 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
305e0 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
305f0 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
30600 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
30610 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
30620 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
30630 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
30640 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
30650 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
30660 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
30670 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
30680 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
30690 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
306a0 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
306b0 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
306c0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
306d0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
306e0 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
306f0 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
30700 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
30710 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
30720 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
30730 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
30740 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
30750 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
30760 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
30770 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
30780 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
30790 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
307a0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
307b0 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
307c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
307d0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
307e0 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
307f0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
30800 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
30810 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
30820 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
30830 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
30840 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
30850 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
30860 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
30870 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
30880 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
30890 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
308a0 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
308b0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
308c0 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
308d0 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
308e0 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
308f0 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
30900 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
30910 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
30920 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
30930 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
30940 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
30950 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
30960 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
30970 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
30980 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
30990 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
309a0 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
309b0 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
309c0 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
309d0 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
309e0 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
309f0 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
30a00 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
30a10 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
30a20 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
30a30 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
30a40 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
30a50 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
30a60 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
30a70 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
30a80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
30a90 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
30aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30ab0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
30ac0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
30ad0 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
30ae0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
30af0 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
30b00 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
30b10 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
30b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30b30 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
30b40 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
30b50 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
30b60 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
30b70 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
30b80 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
30b90 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
30ba0 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
30bb0 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
30bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30bd0 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
30be0 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29  a root-page */.)
30bf0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
30c00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
30c10 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
30c20 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
30c30 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
30c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30c50 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
30c60 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
30c70 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
30c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
30c90 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
30ca0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
30cb0 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
30cc0 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
30cd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30ce0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
30cf0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
30d00 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
30d10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30d20 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
30d30 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
30d40 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
30d50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
30d60 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
30d70 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
30d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
30d90 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
30da0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
30db0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
30dc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30dd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
30de0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
30df0 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
30e00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
30e10 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
30e20 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
30e30 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
30e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e50 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
30e60 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
30e70 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
30e80 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
30e90 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
30ea0 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
30eb0 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
30ec0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
30ed0 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
30ee0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
30ef0 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
30f00 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
30f10 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
30f20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
30f30 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
30f40 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
30f50 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
30f60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30f70 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
30f80 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
30f90 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
30fa0 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
30fb0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
30fc0 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
30fd0 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
30fe0 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
30ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
31000 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
31010 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
31020 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
31030 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
31040 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
31050 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
31060 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
31070 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
31080 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
31090 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
310a0 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
310b0 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
310c0 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
310d0 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
310e0 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
310f0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
31100 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
31110 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
31120 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
31130 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
31140 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
31150 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
31160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
31170 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
31180 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
31190 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
311a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
311b0 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
311c0 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
311d0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
311e0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
311f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
31200 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
31210 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
31220 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
31230 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
31240 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
31250 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
31260 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
31270 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
31280 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
31290 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
312a0 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
312b0 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
312c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
312d0 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
312e0 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
312f0 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
31300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31310 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
31320 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
31330 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
31340 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
31350 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
31360 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
31370 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
31380 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31390 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
313a0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
313b0 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
313c0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
313d0 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
313e0 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
313f0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
31400 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
31410 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
31420 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
31430 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
31440 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
31450 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
31460 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
31470 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
31480 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
31490 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
314a0 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
314b0 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
314c0 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
314d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
314e0 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
314f0 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
31500 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
31510 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
31520 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
31530 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
31540 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
31550 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
31560 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31570 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
31580 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69  >aOvfl[0].idx==i
31590 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20  ParentIdx );..  
315a0 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20  if( !aOvflSpace 
315b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
315c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
315d0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
315e0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
315f0 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f  balance. Also lo
31600 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69  cate the cells i
31610 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20  n pParent .  ** 
31620 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20  that divide the 
31630 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74  siblings. An att
31640 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
31650 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
31660 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72   on .  ** either
31670 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
31680 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
31690 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
316a0 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
316b0 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61  .  ** if there a
316c0 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
316d0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
316e0 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20   other side. If 
316f0 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
31700 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
31710 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
31720 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
31730 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a  nt are taken.  .
31740 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
31750 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74  oop also drops t
31760 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
31770 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
31780 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a   page. This.  **
31790 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e   way, the remain
317a0 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74  der of the funct
317b0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ion does not hav
317c0 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  e to deal with a
317d0 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  ny.  ** overflow
317e0 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61   cells in the pa
317f0 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65  rent page, since
31800 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20   if any existed 
31810 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68  they will.  ** h
31820 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
31830 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20   removed..  */. 
31840 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   i = pParent->nO
31850 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e  verflow + pParen
31860 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  t->nCell;.  if( 
31870 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  i<2 ){.    nxDiv
31880 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d   = 0;.    nOld =
31890 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i+1;.  }else{. 
318a0 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20     nOld = 3;.   
318b0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
318c0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
318d0 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
318e0 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
318f0 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
31900 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
31910 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65  iv = i-2;.    }e
31920 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  lse{.      nxDiv
31930 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
31940 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
31950 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e  ;.  }.  if( (i+n
31960 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
31970 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e  verflow)==pParen
31980 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
31990 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e  pRight = &pParen
319a0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
319b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a  ->hdrOffset+8];.
319c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69    }else{.    pRi
319d0 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ght = findCell(p
319e0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
319f0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
31a00 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20  ow);.  }.  pgno 
31a10 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68  = get4byte(pRigh
31a20 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  t);.  while( 1 )
31a30 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
31a40 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
31a50 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  gno, &apOld[i]);
31a60 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
31a70 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
31a80 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
31a90 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
31aa0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
31ab0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
31ac0 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
31ad0 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
31ae0 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
31af0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
31b00 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
31b10 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78  k;..    if( i+nx
31b20 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f  Div==pParent->aO
31b30 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50  vfl[0].idx && pP
31b40 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
31b50 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
31b60 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f  i] = pParent->aO
31b70 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
31b80 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
31b90 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
31ba0 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
31bb0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
31bc0 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
31bd0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
31be0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
31bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
31c00 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
31c10 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
31c20 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
31c30 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
31c40 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
31c50 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
31c60 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
31c70 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
31c80 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
31c90 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
31ca0 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
31cb0 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
31cc0 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
31cd0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
31ce0 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
31cf0 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
31d00 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
31d10 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
31d20 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
31d30 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
31d40 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
31d50 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
31d60 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
31d70 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
31d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
31d90 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
31da0 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
31db0 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
31dc0 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
31dd0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
31de0 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
31df0 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
31e00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31e10 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65  ** But not if we
31e20 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64   are in secure-d
31e30 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73  elete mode. In s
31e40 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
31e50 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
31e60 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
31e70 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
31e80 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
31e90 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
31ea0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
31eb0 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
31ec0 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
31ed0 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
31ee0 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
31ef0 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
31f00 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
31f10 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
31f20 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
31f30 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
31f40 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  located.  */.   
31f50 20 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75     if( pBt->secu
31f60 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
31f70 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20      int iOff;.. 
31f80 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51         iOff = SQ
31f90 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
31fa0 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49  apDiv[i]) - SQLI
31fb0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50  TE_PTR_TO_INT(pP
31fc0 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20  arent->aData);. 
31fd0 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
31fe0 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29  +szNew[i])>(int)
31ff0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
32000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
32010 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32020 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
32030 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
32040 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
32050 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
32060 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
32070 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
32080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32090 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66      memcpy(&aOvf
320a0 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70  lSpace[iOff], ap
320b0 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d  Div[i], szNew[i]
320c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44  );.          apD
320d0 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70  iv[i] = &aOvflSp
320e0 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61  ace[apDiv[i]-pPa
320f0 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20  rent->aData];.  
32100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
32110 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
32120 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
32130 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
32140 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72  ow, szNew[i], &r
32150 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
32160 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
32170 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
32180 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
32190 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
321a0 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
321b0 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
321c0 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
321d0 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
321e0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
321f0 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
32200 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42  es.  */.  k = pB
32210 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f  t->pageSize + RO
32220 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
32230 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74  age));.  szScrat
32240 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
32250 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
32260 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
32270 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
32280 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
32290 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
322a0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
322b0 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
322c0 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  l */.     + pBt-
322d0 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
322e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322f0 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
32300 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e  e1 */.     + k*n
32310 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
32320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32330 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
32340 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29   copies (apCopy)
32350 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
32360 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
32370 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
32380 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
32390 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
323a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
323b0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
323c0 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
323d0 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
323e0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
323f0 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a    aSpace1 = (u8*
32400 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
32410 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ls];.  assert( E
32420 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
32430 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a  ENT(aSpace1) );.
32440 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
32450 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
32460 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
32470 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
32480 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
32490 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
324a0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
324b0 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
324c0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
324d0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
324e0 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
324f0 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
32500 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
32510 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
32520 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
32530 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
32540 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
32550 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
32560 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
32570 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
32580 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
32590 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
325a0 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
325b0 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
325c0 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
325d0 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
325e0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
325f0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
32600 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
32610 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
32620 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
32630 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
32640 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
32650 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
32660 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
32670 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
32680 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
32690 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
326a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
326b0 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
326c0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
326d0 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
326e0 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
326f0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
32700 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
32710 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
32720 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
32730 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
32740 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
32750 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61   = apOld[0]->lea
32760 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
32770 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44  = apOld[0]->hasD
32780 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
32790 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
327a0 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
327b0 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
327c0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
327d0 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
327e0 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
327f0 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
32800 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
32810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
32820 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
32830 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
32840 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
32850 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
32860 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
32870 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
32880 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
32890 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
328a0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
328b0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
328c0 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
328d0 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
328e0 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
328f0 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
32900 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
32910 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
32920 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
32930 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
32940 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
32950 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
32960 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
32970 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
32980 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
32990 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
329a0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
329b0 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
329c0 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
329d0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
329e0 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
329f0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
32a00 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32a10 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
32a20 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
32a30 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
32a40 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
32a50 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
32a60 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
32a70 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
32a80 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
32a90 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
32aa0 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d       u8 *aData =
32ab0 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20   pOld->aData;.  
32ac0 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65      u16 maskPage
32ad0 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67   = pOld->maskPag
32ae0 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c  e;.      u16 cel
32af0 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e  lOffset = pOld->
32b00 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
32b10 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
32b20 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
32b30 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
32b40 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
32b50 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
32b60 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28  l] = findCellv2(
32b70 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c  aData, maskPage,
32b80 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b   cellOffset, j);
32b90 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
32ba0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
32bb0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
32bc0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
32bd0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
32be0 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20    }.    }       
32bf0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
32c00 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
32c10 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
32c20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
32c30 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
32c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
32c50 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
32c60 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
32c70 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
32c80 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
32c90 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
32ca0 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
32cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
32cc0 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
32cd0 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
32ce0 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20  ert( iSpace1 <= 
32cf0 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
32d00 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
32d10 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
32d20 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
32d30 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
32d40 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
32d50 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
32d60 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
32d70 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
32d80 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
32d90 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
32da0 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
32db0 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
32dc0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
32dd0 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
32de0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
32df0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
32e00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32e10 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
32e20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
32e30 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
32e40 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
32e50 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
32e60 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
32e70 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
32e80 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
32e90 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
32ea0 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
32eb0 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
32ec0 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
32ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
32ee0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
32ef0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
32f00 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
32f10 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
32f20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
32f30 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
32f40 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
32f50 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
32f60 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
32f70 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
32f80 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
32f90 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
32fa0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
32fb0 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
32fc0 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
32fd0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
32fe0 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
32ff0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
33000 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
33010 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
33020 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
33030 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
33040 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
33050 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
33060 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
33070 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
33080 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
33090 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
330a0 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
330b0 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
330c0 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
330d0 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
330e0 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
330f0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
33100 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
33110 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
33120 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
33130 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
33140 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
33150 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
33160 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
33170 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
33180 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
33190 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
331a0 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
331b0 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
331c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
331d0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
331e0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
331f0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
33200 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
33210 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
33220 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
33230 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
33240 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
33250 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
33260 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
33270 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
33280 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
33290 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
332a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
332b0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
332c0 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
332d0 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
332e0 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
332f0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
33300 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
33310 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
33320 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
33330 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
33340 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
33350 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
33360 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
33370 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
33380 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
33390 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
333a0 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
333b0 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
333c0 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
333d0 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
333e0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
333f0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
33400 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
33410 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
33420 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
33430 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
33440 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
33450 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
33460 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
33470 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
33480 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
33490 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
334a0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
334b0 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
334c0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
334d0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
334e0 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
334f0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
33500 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
33510 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
33520 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
33530 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
33540 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
33550 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
33560 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
33570 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
33580 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
33590 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
335a0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
335b0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
335c0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
335d0 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
335e0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
335f0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
33600 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
33610 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
33620 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
33630 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
33640 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
33650 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
33660 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
33670 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
33680 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
33690 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
336a0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
336b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
336c0 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
336d0 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
336e0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
336f0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
33700 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
33710 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
33720 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
33730 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
33740 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
33750 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
33760 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
33770 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
33780 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
33790 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
337a0 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
337b0 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
337c0 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
337d0 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
337e0 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
337f0 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
33800 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
33810 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
33820 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
33830 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
33840 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
33850 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
33860 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
33870 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
33880 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
33890 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
338a0 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
338b0 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
338c0 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
338d0 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
338e0 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65  [0])>0) or pPage
338f0 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75   is.  ** a virtu
33900 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
33910 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
33920 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
33930 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
33940 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
33950 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
33960 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
33970 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
33980 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
33990 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
339a0 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
339b0 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
339c0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
339d0 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
339e0 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d   ",.    apOld[0]
339f0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c  ->pgno, .    nOl
33a00 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d  d>=2 ? apOld[1]-
33a10 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e  >pgno : 0,.    n
33a20 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32  Old>=3 ? apOld[2
33a30 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29  ]->pgno : 0.  ))
33a40 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
33a50 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
33a60 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
33a70 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
33a80 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  le..  */.  if( a
33a90 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31  pOld[0]->pgno<=1
33aa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
33ab0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33ac0 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
33ad0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
33ae0 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70    pageFlags = ap
33af0 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d  Old[0]->aData[0]
33b00 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
33b10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
33b20 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
33b30 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
33b40 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
33b50 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
33b60 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
33b70 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
33b80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33b90 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
33ba0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
33bb0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
33bc0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33bd0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
33be0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
33bf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
33c00 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
33c10 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
33c20 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  o, pgno, 0);.   
33c30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
33c40 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
33c50 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
33c60 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
33c70 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  New++;..      /*
33c80 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
33c90 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74  -map entry for t
33ca0 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
33cb0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  age. */.      if
33cc0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
33cd0 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
33ce0 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70  Put(pBt, pNew->p
33cf0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
33d00 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
33d10 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
33d20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33d30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
33d40 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
33d50 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
33d60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
33d70 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
33d80 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
33d90 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
33da0 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
33db0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
33dc0 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67  d ){.    freePag
33dd0 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29  e(apOld[i], &rc)
33de0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
33df0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
33e00 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
33e10 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
33e20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
33e30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
33e40 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
33e50 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
33e60 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
33e70 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
33e80 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
33e90 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
33ea0 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
33eb0 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
33ec0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
33ed0 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
33ee0 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
33ef0 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
33f00 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
33f10 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
33f20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
33f30 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
33f40 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
33f50 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
33f60 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
33f70 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
33f80 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
33f90 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
33fa0 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
33fb0 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
33fc0 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
33fd0 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
33fe0 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
33ff0 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
34000 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
34010 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
34020 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
34030 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
34040 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
34050 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
34060 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
34070 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
34080 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d   minV = apNew[i]
34090 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20  ->pgno;.    int 
340a0 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
340b0 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
340c0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  +){.      if( ap
340d0 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e  New[j]->pgno<(un
340e0 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20  signed)minV ){. 
340f0 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b         minI = j;
34100 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20  .        minV = 
34110 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[j]->pgno;.
34120 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
34130 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
34140 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
34150 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  T;.      pT = ap
34160 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  New[i];.      ap
34170 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
34180 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
34190 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
341a0 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
341b0 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64  ("new: %d(%d) %d
341c0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
341d0 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
341e0 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f    apNew[0]->pgno
341f0 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
34200 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b  nNew>=2 ? apNew[
34210 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  1]->pgno : 0, nN
34220 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
34230 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
34240 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67  3 ? apNew[2]->pg
34250 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  no : 0, nNew>=3 
34260 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
34270 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70      nNew>=4 ? ap
34280 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[3]->pgno : 0
34290 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
342a0 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
342b0 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d  ew>=5 ? apNew[4]
342c0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
342d0 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
342e0 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28   0));..  assert(
342f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34300 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
34310 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
34320 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c  put4byte(pRight,
34330 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e   apNew[nNew-1]->
34340 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  pgno);..  /*.  *
34350 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
34360 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
34370 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
34380 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
34390 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
343a0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
343b0 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
343c0 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
343d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
343e0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
343f0 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
34400 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
34410 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
34420 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
34430 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
34440 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34450 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
34460 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20  pageFlags);.    
34470 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
34480 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20  w, cntNew[i]-j, 
34490 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43  &apCell[j], &szC
344a0 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73  ell[j]);.    ass
344b0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c  ert( pNew->nCell
344c0 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26  >0 || (nNew==1 &
344d0 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20  & cntNew[0]==0) 
344e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
344f0 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  New->nOverflow==
34500 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e  0 );..    j = cn
34510 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a  tNew[i];..    /*
34520 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
34530 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
34540 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65  bove was not the
34550 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
34560 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65  ing,.    ** inse
34570 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  rt a divider cel
34580 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  l into the paren
34590 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
345a0 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65     assert( i<nNe
345b0 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20  w-1 || j==nCell 
345c0 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65  );.    if( j<nCe
345d0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
345e0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
345f0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
34600 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
34610 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
34620 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
34630 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
34640 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
34650 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
34660 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  on;.      pTemp 
34670 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  = &aOvflSpace[iO
34680 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  vflSpace];.     
34690 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
346a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
346b0 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
346c0 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
346d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
346e0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
346f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65     /* If the tre
34700 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
34710 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
34720 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
34730 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
34740 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
34750 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
34760 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
34770 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
34780 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
34790 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
347a0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
347b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
347c0 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
347d0 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
347e0 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
347f0 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
34800 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
34810 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
34820 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
34830 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
34840 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
34850 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
34860 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
34870 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d  mp;.        sz =
34880 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26   4 + putVarint(&
34890 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e  pCell[4], info.n
348a0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54  Key);.        pT
348b0 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
348c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
348d0 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
348e0 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
348f0 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
34900 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
34910 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
34920 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
34930 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
34940 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
34950 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65   and its reporte
34960 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
34970 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
34980 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
34990 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
349a0 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
349b0 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50    ** (see btreeP
349c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34  arseCellPtr(), 4
349d0 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69   bytes is the mi
349e0 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20  nimum size of.  
349f0 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c        ** any cel
34a00 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d  l). But it is im
34a10 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20  portant to pass 
34a20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65  the correct size
34a30 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   to .        ** 
34a40 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f  insertCell(), so
34a50 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c   reparse the cel
34a60 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  l now..        *
34a70 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
34a80 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20  e that this can 
34a90 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20  never happen in 
34aa0 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66  an SQLite data f
34ab0 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20  ile, as all.    
34ac0 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65      ** cells are
34ad0 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
34ae0 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65  s. It only happe
34af0 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73  ns in b-trees us
34b00 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ed.        ** to
34b10 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53   evaluate "IN (S
34b20 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20  ELECT ...)" and 
34b30 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e  similar clauses.
34b40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34b50 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a      if( szCell[j
34b60 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==4 ){.        
34b70 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72    assert(leafCor
34b80 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20  rection==4);.   
34b90 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
34ba0 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
34bb0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pCell);.       
34bc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
34bd0 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73   iOvflSpace += s
34be0 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
34bf0 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63   sz<=pBt->maxLoc
34c00 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61  al+23 );.      a
34c10 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63  ssert( iOvflSpac
34c20 65 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70  e <= (int)pBt->p
34c30 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
34c40 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
34c50 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
34c60 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e  l, sz, pTemp, pN
34c70 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ew->pgno, &rc);.
34c80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34c90 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
34ca0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
34cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
34cc0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34cd0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
34ce0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
34cf0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
34d00 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
34d10 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
34d20 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
34d30 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
34d40 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
34d50 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
34d60 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
34d70 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20  .    u8 *zChild 
34d80 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  = &apCopy[nOld-1
34d90 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20  ]->aData[8];.   
34da0 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
34db0 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
34dc0 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20  , zChild, 4);.  
34dd0 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20  }..  if( isRoot 
34de0 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
34df0 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d  l==0 && pParent-
34e00 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65  >hdrOffset<=apNe
34e10 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  w[0]->nFree ){. 
34e20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
34e30 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
34e40 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e  e now contains n
34e50 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c  o cells. The onl
34e60 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  y sibling.    **
34e70 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69 67   page is the rig
34e80 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
34e90 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65  parent. Copy the
34ea0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34eb0 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61  .    ** child pa
34ec0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ge into the pare
34ed0 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74  nt, decreasing t
34ee0 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68  he overall heigh
34ef0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
34f00 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
34f10 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73   by one. This is
34f20 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74 68   described as th
34f30 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c  e "balance-shall
34f40 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62  ower".    ** sub
34f50 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f  -algorithm in so
34f60 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  me documentation
34f70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
34f80 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
34f90 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
34fa0 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  se, the call to 
34fb0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
34fc0 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61  ) .    ** sets a
34fd0 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ll pointer-map e
34fe0 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e  ntries correspon
34ff0 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
35000 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20   image pages .  
35010 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74    ** for which t
35020 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74  he pointer is st
35030 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
35040 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f  content being co
35050 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  pied..    **.   
35060 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61   ** The second a
35070 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69  ssert below veri
35080 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68  fies that the ch
35090 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66 72  ild page is defr
350a0 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20  agmented.    ** 
350b0 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20  (it must be, as 
350c0 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f  it was just reco
350d0 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67 20  nstructed using 
350e0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e  assemblePage()).
350f0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
35100 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65  important if the
35110 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61 70   parent page hap
35120 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20  pens to be page 
35130 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
35140 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20  e.    ** image. 
35150 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35160 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61  nNew==1 );.    a
35170 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d  ssert( apNew[0]-
35180 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20  >nFree == .     
35190 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61 70     (get2byte(&ap
351a0 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d  New[0]->aData[5]
351b0 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c  )-apNew[0]->cell
351c0 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d  Offset-apNew[0]-
351d0 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29  >nCell*2) .    )
351e0 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f  ;.    copyNodeCo
351f0 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20  ntent(apNew[0], 
35200 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20  pParent, &rc);. 
35210 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e 65     freePage(apNe
35220 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65  w[0], &rc);.  }e
35230 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56 41  lse if( ISAUTOVA
35240 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46  CUUM ){.    /* F
35250 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ix the pointer-m
35260 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
35270 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61  ll the cells tha
35280 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20 61  t were shifted a
35290 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54  round. .    ** T
352a0 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
352b0 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
352c0 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   of pointer-map 
352d0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65 65  entries that nee
352e0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64  d to.    ** be d
352f0 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 69  ealt with by thi
35300 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20  s routine. Some 
35310 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62 65  of these have be
35320 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20  en set already, 
35330 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20  but.    ** many 
35340 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f  have not. The fo
35350 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d  llowing is a sum
35360 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mary:.    **.   
35370 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74   **   1) The ent
35380 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
35390 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67  with new sibling
353a0 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
353b0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20   not.    **     
353c0 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74   siblings when t
353d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
353e0 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68   called. These h
353f0 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ave already.    
35400 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65 74  **      been set
35410 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20  . We don't need 
35420 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f  to worry about o
35430 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  ld siblings that
35440 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   were.    **    
35450 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66    moved to the f
35460 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66  ree-list - the f
35470 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20 68  reePage() code h
35480 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20  as taken care.  
35490 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f    **      of tho
354a0 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
354b0 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74  *   2) The point
354c0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er-map entries a
354d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
354e0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
354f0 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61  w.    **      pa
35500 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c  ge in any overfl
35510 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20 62  ow chains used b
35520 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  y new divider ce
35530 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20  lls. These .    
35540 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c 73  **      have als
35550 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  o already been t
35560 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20  aken care of by 
35570 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29  the insertCell()
35580 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
35590 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65    **   3) If the
355a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
355b0 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
355c0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61  hen the child pa
355d0 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20  ges of.    **   
355e0 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20     cells stored 
355f0 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  on the sibling p
35600 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ages may need to
35610 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
35620 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20   **.    **   4) 
35630 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
35640 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74  ages are not int
35650 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
35660 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20  es, then any.   
35670 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f   **      overflo
35680 77 20 70 61 67 65 73 20 75 73 65 64 20 62 79 20  w pages used by 
35690 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20  these cells may 
356a0 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
356b0 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28  ed.    **      (
356c0 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
356d0 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74  nodes never cont
356e0 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ain pointers to 
356f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
35700 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
35710 20 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   5) If the sibli
35720 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
35730 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
35740 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
35750 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65    **      entrie
35760 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  s for the right-
35770 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65  child pages of e
35780 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20  ach sibling may 
35790 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  need.    **     
357a0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
357b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61      **.    ** Ca
357c0 73 65 73 20 31 20 61 6e 64 20 32 20 61 72 65 20  ses 1 and 2 are 
357d0 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65  dealt with above
357e0 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20   by other code. 
357f0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
35800 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
35810 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 20 61   cases 3 and 4 a
35820 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72  nd the one after
35830 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53   that, case 5. S
35840 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74  ince.    ** sett
35850 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61  ing a pointer ma
35860 70 20 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c  p entry is a rel
35870 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76  atively expensiv
35880 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69  e operation, thi
35890 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e  s.    ** code on
358a0 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20  ly sets pointer 
358b0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
358c0 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
358d0 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  w pages that hav
358e0 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  e.    ** actuall
358f0 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20  y moved between 
35900 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d  pages.  */.    M
35910 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
35920 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d  pNew[0];.    Mem
35930 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
35940 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[0];.    int 
35950 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64  nOverflow = pOld
35960 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
35970 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20   int iNextOld = 
35980 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f  pOld->nCell + nO
35990 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74  verflow;.    int
359a0 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f   iOverflow = (nO
359b0 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e  verflow ? pOld->
359c0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d  aOvfl[0].idx : -
359d0 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
359e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
35a00 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
35a10 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
35a20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
35a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a40 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
35a50 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
35a60 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
35a70 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
35a80 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
35a90 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
35aa0 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
35ab0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
35ac0 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
35ad0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
35ae0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
35af0 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
35b00 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
35b10 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
35b20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
35b30 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
35b40 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
35b50 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
35b60 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
35b70 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
35b80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
35b90 2b 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  +1 < ArraySize(a
35ba0 70 43 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20  pCopy) );.      
35bb0 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b    pOld = apCopy[
35bc0 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e  ++j];.        iN
35bd0 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65  extOld = i + !le
35be0 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e  afData + pOld->n
35bf0 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76  Cell + pOld->nOv
35c00 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
35c10 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  if( pOld->nOverf
35c20 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
35c30 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
35c40 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
35c50 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
35c60 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  w = i + !leafDat
35c70 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  a + pOld->aOvfl[
35c80 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20  0].idx;.        
35c90 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  }.        isDivi
35ca0 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b  der = !leafData;
35cb0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
35cc0 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
35cd0 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f  ow>0 || iOverflo
35ce0 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73  w<i );.      ass
35cf0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20  ert(nOverflow<2 
35d00 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30  || pOld->aOvfl[0
35d10 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
35d20 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[1].idx-1);.  
35d30 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
35d40 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<3 || pOld->
35d50 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[1].idx==pO
35d60 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78  ld->aOvfl[2].idx
35d70 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  -1);.      if( i
35d80 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ==iOverflow ){. 
35d90 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
35da0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
35db0 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e  ( (--nOverflow)>
35dc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
35dd0 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
35de0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
35df0 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e       if( i==cntN
35e00 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20  ew[k] ){.       
35e10 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
35e20 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
35e30 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
35e40 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65   last cell on ne
35e50 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  w.        ** sib
35e60 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20  ling page k. If 
35e70 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
35e80 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
35e90 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
35ea0 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
35eb0 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61  then cell i is a
35ec0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20   divider cell.  
35ed0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
35ee0 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20  = apNew[++k];.  
35ef0 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44        if( !leafD
35f00 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ata ) continue;.
35f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
35f20 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a  sert( j<nOld );.
35f30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
35f40 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f  nNew );..      /
35f50 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61  * If the cell wa
35f60 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76  s originally div
35f70 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69  ider cell (and i
35f80 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20  s not now) or.  
35f90 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c      ** an overfl
35fa0 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74  ow cell, or if t
35fb0 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61  he cell was loca
35fc0 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ted on a differe
35fd0 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20  nt sibling.     
35fe0 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20   ** page before 
35ff0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
36000 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20  hen the pointer 
36010 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
36020 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ciated.      ** 
36030 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f  with any child o
36040 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
36050 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
36060 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
36070 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20  f( isDivider || 
36080 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  pOld->pgno!=pNew
36090 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
360a0 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
360b0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
360c0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
360d0 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
360e0 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
360f0 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  REE, pNew->pgno,
36100 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
36110 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
36120 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e  ell[i]>pNew->min
36130 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
36140 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
36150 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
36160 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  [i], &rc);.     
36170 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36180 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61   }..    if( !lea
36190 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20  fCorrection ){. 
361a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
361b0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
361c0 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65      u32 key = ge
361d0 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d  t4byte(&apNew[i]
361e0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
361f0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
36200 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f  Bt, key, PTRMAP_
36210 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d  BTREE, apNew[i]-
36220 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
36230 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20     }.    }..#if 
36240 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72  0.    /* The ptr
36250 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20  mapCheckPages() 
36260 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28  contains assert(
36270 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
36280 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20  t verify that.  
36290 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72    ** all pointer
362a0 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73   map pages are s
362b0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68  et correctly. Th
362c0 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68  is is helpful wh
362d0 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75  ile .    ** debu
362e0 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75  gging. This is u
362f0 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20  sually disabled 
36300 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70  because a corrup
36310 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20  t database may. 
36320 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61     ** cause an a
36330 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
36340 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20  t to fail.  */. 
36350 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
36360 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29  ges(apNew, nNew)
36370 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  ;.    ptrmapChec
36380 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c  kPages(&pParent,
36390 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   1);.#endif.  }.
363a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
363b0 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
363c0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
363d0 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25   finished: old=%
363e0 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
363f0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
36400 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
36410 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  l));..  /*.  ** 
36420 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
36430 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
36440 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
36450 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
36460 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
36470 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
36480 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
36490 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
364a0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
364b0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
364c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
364d0 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20  pNew[i]);.  }.. 
364e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
364f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
36500 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36510 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  en the root page
36520 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72   of a b-tree str
36530 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65  ucture is.** ove
36540 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f  rfull (has one o
36550 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
36560 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20  pages)..**.** A 
36570 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69  new child page i
36580 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
36590 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
365a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74  the current root
365b0 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64  .** page, includ
365c0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ing overflow cel
365d0 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69  ls, are copied i
365e0 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54  nto the child. T
365f0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
36600 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  is then overwrit
36610 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61  ten to make it a
36620 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
36630 68 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  h the right-chil
36640 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f  d .** pointer po
36650 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
36660 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  w page..**.** Be
36670 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
36680 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
36690 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
366a0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a  nding to pages .
366b0 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
366c0 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63  child-page now c
366d0 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
366e0 20 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e   to are updated.
366f0 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f   The.** entry co
36700 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
36710 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
36720 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ld pointer of th
36730 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
36740 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a  s also updated..
36750 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
36760 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73  ful, *ppChild is
36770 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20   set to contain 
36780 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
36790 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67  he child .** pag
367a0 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
367b0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
367c0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61  this case the ca
367d0 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64  ller is required
367e0 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  .** to call rele
367f0 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70  asePage() on *pp
36800 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e  Child exactly on
36810 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ce. If an error 
36820 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
36830 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
36840 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c  rned and *ppChil
36850 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
36860 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
36870 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
36880 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50  age *pRoot, MemP
36890 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a  age **ppChild){.
368a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
368b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368c0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
368d0 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
368e0 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
368f0 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20   *pChild = 0;   
36900 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
36910 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
36920 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
36930 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20   pgnoChild = 0; 
36940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
36950 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
36960 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
36970 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
36980 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b  Bt = pRoot->pBt;
36990 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
369a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
369b0 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Root->nOverflow>
369c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
369d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
369e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
369f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f  ..  /* Make pRoo
36a00 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  t, the root page
36a10 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20   of the b-tree, 
36a20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61  writable. Alloca
36a30 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70  te a new .  ** p
36a40 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
36a50 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67  come the new rig
36a60 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67  ht-child of pPag
36a70 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  e. Copy the cont
36a80 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
36a90 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20   node stored on 
36aa0 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e  pRoot into the n
36ab0 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ew child page.. 
36ac0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
36ad0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
36ae0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
36af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36b00 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  K ){.    rc = al
36b10 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
36b20 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e  pBt,&pChild,&pgn
36b30 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67  oChild,pRoot->pg
36b40 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e  no,0);.    copyN
36b50 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74  odeContent(pRoot
36b60 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a  , pChild, &rc);.
36b70 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
36b80 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
36b90 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
36ba0 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42  oChild, PTRMAP_B
36bb0 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  TREE, pRoot->pgn
36bc0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
36bd0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
36be0 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b     *ppChild = 0;
36bf0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
36c00 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65  (pChild);.    re
36c10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
36c20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
36c30 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36c40 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20  Child->pDbPage) 
36c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36c60 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36c70 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
36c80 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
36c90 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
36ca0 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b  =pRoot->nCell );
36cb0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
36cc0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
36cd0 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52  d into %d\n", pR
36ce0 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  oot->pgno, pChil
36cf0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a  d->pgno));..  /*
36d00 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c   Copy the overfl
36d10 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52  ow cells from pR
36d20 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f  oot to pChild */
36d30 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64  .  memcpy(pChild
36d40 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
36d50 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f  aOvfl, pRoot->nO
36d60 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
36d70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Root->aOvfl[0]))
36d80 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  ;.  pChild->nOve
36d90 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e  rflow = pRoot->n
36da0 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20  Overflow;..  /* 
36db0 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  Zero the content
36dc0 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e  s of pRoot. Then
36dd0 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20   install pChild 
36de0 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  as the right-chi
36df0 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67  ld. */.  zeroPag
36e00 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d  e(pRoot, pChild-
36e10 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
36e20 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
36e30 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
36e40 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
36e50 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
36e60 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  ;..  *ppChild = 
36e70 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e  pChild;.  return
36e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
36e90 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68  *.** The page th
36ea0 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c  at pCur currentl
36eb0 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  y points to has 
36ec0 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69  just been modifi
36ed0 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61  ed in.** some wa
36ee0 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
36ef0 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20   figures out if 
36f00 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  this modificatio
36f10 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74  n means the.** t
36f20 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
36f30 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66  balanced, and if
36f40 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70   so calls the ap
36f50 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
36f60 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  ing .** routine.
36f70 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   Balancing routi
36f80 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  nes are:.**.**  
36f90 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
36fa0 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65  .**   balance_de
36fb0 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61  eper().**   bala
36fc0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f  nce_nonroot().*/
36fd0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
36fe0 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
36ff0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
37000 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e  SQLITE_OK;.  con
37010 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43  st int nMin = pC
37020 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
37030 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75  ize * 2 / 3;.  u
37040 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  8 aBalanceQuickS
37050 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a  pace[13];.  u8 *
37060 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45  pFree = 0;..  TE
37070 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
37080 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
37090 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e   = 0 );.  TESTON
370a0 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
370b0 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20  deeper_called = 
370c0 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  0 );..  do {.   
370d0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
370e0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65  r->iPage;.    Me
370f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
37100 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
37110 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61  e];..    if( iPa
37120 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ge==0 ){.      i
37130 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
37140 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  low ){.        /
37150 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
37160 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  of the b-tree is
37170 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
37180 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65  is case call the
37190 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
371a0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e  nce_deeper() fun
371b0 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ction to create 
371c0 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20  a new child for 
371d0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
371e0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70        ** and cop
371f0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  y the current co
37200 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
37210 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54  ot-page to it. T
37220 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  he.        ** ne
37230 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
37240 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
37250 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69   balance the chi
37260 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ld page..       
37270 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73   */ .        ass
37280 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65  ert( (balance_de
37290 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  eper_called++)==
372a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
372b0 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
372c0 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61  (pPage, &pCur->a
372d0 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20  pPage[1]);.     
372e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
372f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37300 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
37310 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  1;.          pCu
37320 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
37330 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
37340 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20  >aiIdx[1] = 0;. 
37350 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
37360 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
37370 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
37380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72  else{.        br
373a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
373b0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
373c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
373d0 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d  & pPage->nFree<=
373e0 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72  nMin ){.      br
373f0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
37400 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20        MemPage * 
37410 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20  const pParent = 
37420 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
37430 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  ge-1];.      int
37440 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43   const iIdx = pC
37450 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d  ur->aiIdx[iPage-
37460 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  1];..      rc = 
37470 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37480 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
37490 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
374a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
374b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
374c0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
374d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
374e0 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20  ge->hasData.    
374f0 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e       && pPage->n
37500 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20  Overflow==1.    
37510 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61       && pPage->a
37520 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
37530 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  ge->nCell.      
37540 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70     && pParent->p
37550 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20  gno!=1.         
37560 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
37570 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20  l==iIdx.        
37580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
37590 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  Call balance_qui
375a0 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61  ck() to create a
375b0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20   new sibling of 
375c0 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20  pPage on which. 
375d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73           ** to s
375e0 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  tore the overflo
375f0 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f  w cell. balance_
37600 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20  quick() inserts 
37610 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20  a new cell.     
37620 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61       ** into pPa
37630 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
37640 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76  cause pParent ov
37650 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a  erflow. If this.
37660 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
37670 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69  pens, the next i
37680 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  nteration of the
37690 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
376a0 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20  lance pParent . 
376b0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
376c0 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e  either balance_n
376d0 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61  onroot() or bala
376e0 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e  nce_deeper(). Un
376f0 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20  til this.       
37700 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
37710 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
37720 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
37730 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
37740 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20  pace[].         
37750 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20   ** buffer. .   
37760 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
37770 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f      ** The purpo
37780 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
37790 69 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20  ing assert() is 
377a0 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e  to check that on
377b0 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  ly a.          *
377c0 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f  * single call to
377d0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
377e0 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63   is made for eac
377f0 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  h call to this. 
37800 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
37810 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65  tion. If this we
37820 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c  re not verified,
37830 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e   a subtle bug in
37840 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20  volving reuse.  
37850 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
37860 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
37870 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65  pace[] might sne
37880 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20  ak in..         
37890 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
378a0 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71  sert( (balance_q
378b0 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  uick_called++)==
378c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
378d0 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  c = balance_quic
378e0 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65  k(pParent, pPage
378f0 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  , aBalanceQuickS
37900 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  pace);.        }
37910 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
37920 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
37930 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
37940 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f   call balance_no
37950 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73  nroot() to redis
37960 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20  tribute cells.  
37970 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
37980 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  en pPage and up 
37990 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c  to 2 of its sibl
379a0 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
379b0 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20  involves.       
379c0 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20     ** modifying 
379d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
379e0 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
379f0 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
37a00 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
37a10 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
37a20 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54   or underfull. T
37a30 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
37a40 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
37a50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69  .          ** wi
37a60 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  ll balance the p
37a70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f  arent page to co
37a80 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20  rrect this..    
37a90 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
37aa0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61      ** If the pa
37ab0 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
37ac0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20  s overfull, the 
37ad0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72  overflow cell or
37ae0 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
37af0 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69   ** are stored i
37b00 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  n the pSpace buf
37b10 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d  fer allocated im
37b20 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e  mediately below.
37b30 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41   .          ** A
37b40 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
37b50 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
37b60 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  loop will deal w
37b70 69 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20  ith this by.    
37b80 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
37b90 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37ba0 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  () (balance_deep
37bb0 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c  er() may be call
37bc0 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20  ed first,.      
37bd0 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f      ** but it do
37be0 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20  esn't deal with 
37bf0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d  overflow cells -
37c00 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d   just moves them
37c10 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20   to a.          
37c20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  ** different pag
37c30 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75  e). Once this su
37c40 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
37c50 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37c60 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  () .          **
37c70 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20   has completed, 
37c80 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
37c90 6c 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65  lease the pSpace
37ca0 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a   buffer used by.
37cb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
37cc0 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20   previous call, 
37cd0 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  as the overflow 
37ce0 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68  cell data will h
37cf0 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20  ave been .      
37d00 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69      ** copied ei
37d10 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f  ther into the bo
37d20 64 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  dy of a database
37d30 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68   page or into th
37d40 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20  e new.          
37d50 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72  ** pSpace buffer
37d60 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c   passed to the l
37d70 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61  atter call to ba
37d80 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
37d90 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
37da0 20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61          u8 *pSpa
37db0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
37dc0 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74  Malloc(pCur->pBt
37dd0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
37de0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
37df0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72  nce_nonroot(pPar
37e00 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63  ent, iIdx, pSpac
37e10 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20  e, iPage==1);.  
37e20 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
37e30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
37e40 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20   /* If pFree is 
37e50 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
37e60 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63  nts to the pSpac
37e70 65 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20  e buffer used . 
37e80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79             ** by
37e90 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c   a previous call
37ea0 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
37eb0 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65  oot(). Its conte
37ec0 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  nts are.        
37ed0 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65      ** now store
37ee0 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c  d either on real
37ef0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
37f00 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20  or within the . 
37f10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65             ** ne
37f20 77 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c  w pSpace buffer,
37f30 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61   so it may be sa
37f40 66 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e  fely freed here.
37f50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
37f60 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
37f70 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  pFree);.        
37f80 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
37f90 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
37fa0 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65  fer will be free
37fb0 64 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74  d after the next
37fc0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   call to.       
37fd0 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f     ** balance_no
37fe0 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74  nroot(), or just
37ff0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
38000 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77  ction returns, w
38010 68 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20  hichever.       
38020 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73     ** comes firs
38030 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
38040 70 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a  pFree = pSpace;.
38050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38060 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  }..      pPage->
38070 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
38080 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
38090 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
380a0 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e  he do-loop balan
380b0 63 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70  ces the parent p
380c0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  age. */.      re
380d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
380e0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50  ;.      pCur->iP
380f0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
38100 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
38110 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  E_OK );..  if( p
38120 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
38130 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
38140 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
38150 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
38160 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
38170 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
38180 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
38190 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
381a0 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
381b0 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
381c0 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
381d0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
381e0 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
381f0 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
38200 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
38210 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
38220 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
38230 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
38240 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
38250 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
38260 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
38270 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
38280 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
38290 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
382a0 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
382b0 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
382c0 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
382d0 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
382e0 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
382f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
38300 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
38310 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
38320 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  en a successful 
38330 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74  call to.** Movet
38340 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73  oUnpacked() to s
38350 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20  eek cursor pCur 
38360 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20  to (pKey, nKey) 
38370 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
38380 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73  een performed. s
38390 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65  eekResult is the
383a0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72   search result r
383b0 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74  eturned (a negat
383c0 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66  ive.** number if
383d0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
383e0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73  an entry that is
383f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70   smaller than (p
38400 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a  Key, nKey), or.*
38410 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  * a positive val
38420 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  ue if pCur point
38430 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61  s at an etry tha
38440 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
38450 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79   .** (pKey, nKey
38460 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  )). .**.** If th
38470 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72  e seekResult par
38480 61 6d 65 74