/ Hex Artifact Content
Login

Artifact d878577184112d982d00ea05afcc7487cd9f06f5:


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 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5f00: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
5f10: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
5f20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
5f30: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
5f40: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
5f50: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
5f60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
5f70: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
5f80: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
5f90: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
5fa0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5fb0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fd0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5fe0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5ff0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6030: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6040: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6050: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6060: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6070: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6080: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6090: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
60a0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
60b0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
60c0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
60d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
60e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
60f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6100: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6110: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6120: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6140: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6150: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6160: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6170: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6180: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6190: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
61a0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
61b0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
61c0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
61d0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
61e0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
61f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6200: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6210: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6220: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6230: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6240: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6250: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6260: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6290: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
62a0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
62b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
62c0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
62d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
62e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
62f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6300: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6310: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6320: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6340: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6360: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6390: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
63a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
63b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
63c0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
63d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63f0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6400: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6410: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6420: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6430: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6450: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6480: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6490: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
64a0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
64b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
64c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
64d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
64e0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
64f0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6500: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6510: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6520: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6530: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6550: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6570: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6580: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6590: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
65a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
65b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
65c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
65d0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
65e0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
65f0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6600: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6610: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6620: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6630: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6640: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6650: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6660: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
6670: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
6680: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
6690: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
66a0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
66b0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
66c0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
66d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
66e0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
66f0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
6700: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
6710: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6720: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
6730: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
6740: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
6750: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6770: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6780: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
67a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
67c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
67d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
67e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
67f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
6800: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
6810: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
6820: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
6830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
6840: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6850: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
6860: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6880: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
6890: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
68a0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
68b0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
68c0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
68d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
68e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
68f0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6900: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6910: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
6920: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6930: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6940: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
6950: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
6960: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
6970: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
6980: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6990: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
69a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
69b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
69c0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
69d0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
69f0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6a00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6a10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6a20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6a30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
6a40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6a50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6a60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
6a70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6a80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6a90: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
6aa0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
6ab0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
6ac0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
6ad0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
6ae0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
6af0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
6b00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6b10: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b20: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6b30: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6b50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6b60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b70: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6b80: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6b90: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6ba0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
6bb0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
6bc0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
6bd0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
6be0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
6bf0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6c00: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
6c10: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
6c20: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
6c30: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
6c40: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
6c50: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
6c60: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
6c70: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6c80: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6ca0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6cb0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6cc0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6cd0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6ce0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6cf0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6d00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6d10: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
6d20: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
6d30: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
6d40: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
6d50: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
6d60: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
6d70: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6d80: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6d90: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6da0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6db0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6dc0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6dd0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6de0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6df0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6e00: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6e10: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
6e20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6e30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6e40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
6e50: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
6e60: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
6e70: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6e80: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6e90: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6ea0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6eb0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6ec0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6ed0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6ef0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6f00: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6f10: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
6f20: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
6f30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
6f40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6f50: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
6f60: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
6f70: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6f80: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6f90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6fa0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6fb0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6fc0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
6fd0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
6fe0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6ff0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
7000: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
7010: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7020: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
7030: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
7040: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
7050: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
7060: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
7070: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
7080: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
7090: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
70a0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
70b0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
70c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
70d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
70e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
70f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7100: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
7120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
7150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
7160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
7180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
7190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
71a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
71b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
71c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
71d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
71e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
71f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
7200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
7210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
7220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
7240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
7250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
7280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
7290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
72a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
72b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
72c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
72d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
72e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
72f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
7300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
73a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
73b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
73c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
73d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
73e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
73f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7470: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7480: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7490: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
74a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
74b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
74c0: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
74d0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
74e0: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
74f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
7500: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7510: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7520: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7530: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7540: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7550: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7560: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
7570: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
7580: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
7590: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
75a0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
75b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
75c0: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
75d0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
75e0: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
75f0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7600: 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a  0;.    if( (nSiz
7610: 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20  e & ~3)==0 ){.  
7620: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
7630: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
7640: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
7650: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
7660: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
7670: 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  )nSize;.  }else{
7680: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7690: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
76a0: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
76b0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
76c0: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
76d0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
76e0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
76f0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7700: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7710: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7720: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
7730: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
7740: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
7750: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
7760: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
7770: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
7780: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7790: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
77a0: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
77b0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
77c0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
77d0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
77e0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
77f0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
7800: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7810: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7820: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
7830: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
7840: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
7850: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
7860: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
7870: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
7880: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7890: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78a0: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
78b0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
78c0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
78d0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78e0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
78f0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7900: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
7910: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
7920: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
7930: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7940: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
7950: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
7960: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
7970: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
7980: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
7990: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
79a0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
79b0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
79c0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
79d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
79e0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
79f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
7a00: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
7a10: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
7a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
7a30: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
7a40: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
7a50: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
7a60: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
7a70: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7a80: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
7a90: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
7aa0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
7ab0: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
7ac0: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
7ad0: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
7ae0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
7af0: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
7b00: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
7b10: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
7b20: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
7b30: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
7b40: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7b50: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
7b60: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7b70: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7b80: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7b90: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
7ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7bb0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
7bc0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
7bd0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7bf0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7c00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
7c10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7c20: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
7c30: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
7c40: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7c50: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
7c60: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
7c70: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
7c80: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
7c90: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
7ca0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
7cb0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7cc0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
7cd0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
7ce0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
7cf0: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
7d00: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
7d10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
7d20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
7d30: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
7d40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7d50: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
7d60: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
7d70: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7d80: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
7d90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7da0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
7db0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7dc0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7dd0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7de0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
7df0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
7e00: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
7e10: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
7e20: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
7e30: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
7e40: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
7e50: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
7e60: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
7e70: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
7e80: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
7e90: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
7ea0: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
7eb0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
7ec0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
7ed0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7ee0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7ef0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7f00: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
7f10: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
7f20: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
7f30: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7f40: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
7f50: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
7f60: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7f80: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7f90: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7fa0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7fb0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7fc0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7fd0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7fe0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7ff0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
8000: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
8010: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
8020: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
8030: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
8040: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
8050: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
8060: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
8070: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
8080: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
80a0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
80b0: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
80c0: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
80d0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
80e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
80f0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8100: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8110: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
8120: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8130: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
8140: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8150: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
8160: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
8170: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
8180: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
8190: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
81a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
81b0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81c0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
81d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
81e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
81f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
8200: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8210: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
8220: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
8230: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
8240: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
8250: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
8260: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
8270: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
8280: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
8290: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
82a0: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
82b0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
82c0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
82d0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
82e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
82f0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
8300: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8310: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
8320: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
8330: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
8340: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
8350: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
8360: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
8370: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
8380: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8390: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
83a0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
83b0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
83c0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
83d0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
83e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
83f0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8400: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8410: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8420: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8430: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8440: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8450: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8460: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
8470: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
8480: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
8490: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
84a0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
84b0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
84c0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
84d0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
84e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
84f0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8500: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8510: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8520: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8530: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8540: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8550: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8560: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
8570: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
8580: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
8590: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
85a0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
85b0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
85c0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
85d0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
85e0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
85f0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8600: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8620: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8630: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8640: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8650: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8660: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
8670: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
8680: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
8690: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
86a0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
86b0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
86c0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
86d0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
86e0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
86f0: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8700: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8710: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8720: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8750: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
8780: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
8790: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
87b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
87c0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
87d0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8800: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8820: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8830: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8840: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8850: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8860: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8870: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
8880: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
8890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
88b0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
88c0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
88d0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
88e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
88f0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8900: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8910: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8930: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
8940: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
8950: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
8960: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
8970: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
8980: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
8990: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
89a0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
89b0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
89c0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
89d0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
89e0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
89f0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8a00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8a10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8a20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8a30: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
8a40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8a50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8a60: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
8a70: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
8a80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8a90: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
8aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8ac0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8ad0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8ae0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8af0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8b00: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8b10: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8b20: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8b30: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8b40: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8b50: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8b60: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
8b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
8b80: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
8b90: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
8ba0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
8bb0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8bc0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8bd0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8be0: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8bf0: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8c00: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8c10: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8c20: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8c30: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8c40: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8c50: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8c60: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
8c70: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
8c80: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
8c90: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
8ca0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
8cb0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8cc0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8cd0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8ce0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8cf0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8d00: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d10: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8d20: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d30: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8d40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8d50: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8d60: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
8d70: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
8d80: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
8d90: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
8da0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
8db0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
8dc0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8dd0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8de0: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8df0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8e00: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8e10: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8e30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8e40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8e50: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8e60: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8e70: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8e80: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8e90: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8ea0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8eb0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8ec0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ed0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ee0: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8f00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8f10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8f20: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8f30: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8f40: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8f50: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8f90: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8fa0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8fb0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8fc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8fd0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8fe0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8ff0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
9000: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9010: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
9020: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
9030: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
9040: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
9050: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
9060: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
9070: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
9080: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9090: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
90a0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
90b0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
90c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
90d0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
90e0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
90f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
9100: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9110: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9120: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9130: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
9140: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
9150: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
9160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9170: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
9180: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9190: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
91a0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
91b0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
91c0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
91d0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
91e0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
91f0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
9200: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
9210: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
9220: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
9230: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
9240: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
9250: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
9260: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
9270: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
9280: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
9290: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
92a0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
92b0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
92c0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
92d0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
92e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
92f0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
9300: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
9310: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9320: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
9330: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
9340: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
9350: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
9360: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
9370: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
9380: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
9390: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
93a0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
93b0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
93c0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
93d0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
93e0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
93f0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9400: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9410: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9430: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9440: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9450: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9460: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
9470: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9480: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
9490: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
94a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
94b0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
94c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
94d0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
94e0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
94f0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9500: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9530: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9540: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9550: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9580: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
9590: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
95a0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
95b0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
95c0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
95d0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
95e0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
95f0: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9600: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9610: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  de */.  int usab
9620: 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
9630: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
9640: 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ge */.  .  asser
9650: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9660: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9670: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9680: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9690: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
96a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
96b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
96c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
96d0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
96e0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
96f0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9700: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9710: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9720: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9730: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9740: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
9750: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9760: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9770: 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69  nByte < usableSi
9780: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
9790: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
97a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
97b0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
97c0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
97d0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
97e0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
97f0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9800: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9810: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9820: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9830: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
9840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
9860: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
9870: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9880: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9890: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
98a0: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
98b0: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
98c0: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
98d0: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
98e0: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
98f0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9900: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9910: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9920: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9930: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
9940: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9950: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
9960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
9970: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
9980: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
9990: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
99a0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
99b0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
99c0: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
99d0: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
99e0: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
99f0: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9a00: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9a10: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9a20: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
9a30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9a40: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
9a50: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
9a60: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
9a70: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
9a80: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
9a90: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9aa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9ab0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
9ac0: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9ad0: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
9ae0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
9b20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9b30: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9b40: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
9b50: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
9b60: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
9b70: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9b80: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
9b90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
9ba0: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
9bb0: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
9bc0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
9bd0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
9be0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
9bf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
9c00: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
9c10: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
9c20: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
9c30: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9c40: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
9c50: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
9c60: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
9c70: 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20  7] = (u8)(nFrag 
9c80: 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  + x);.        }e
9c90: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
9ca0: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
9cb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9cc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9cd0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
9ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
9cf0: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
9d00: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
9d10: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
9d20: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
9d30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
9d40: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
9d50: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
9d60: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
9d70: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
9d80: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
9d90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9da0: 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78    *pIdx = pc + x
9db0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9dc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9dd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9de0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
9df0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9e00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20  enough space in 
9e10: 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73  the gap to satis
9e20: 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f  fy.  ** the allo
9e30: 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c  cation.  If not,
9e40: 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a   defragment..  *
9e50: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
9e60: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
9e70: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
9e80: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72  yte>top ){.    r
9e90: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9ea0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9eb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9ec0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9ed0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9ee0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
9ef0: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
9f00: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
9f10: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
9f20: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
9f30: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
9f40: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9f50: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
9f60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9f70: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
9f80: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
9f90: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
9fa0: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
9fb0: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
9fc0: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
9fd0: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
9fe0: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
9ff0: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
a000: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
a010: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
a020: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
a030: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
a040: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
a050: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
a060: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
a070: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
a080: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
a0a0: 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d  +nByte <= pPage-
a0b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a0c0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
a0d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
a0e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a0f0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
a100: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
a110: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
a120: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
a130: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
a140: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
a150: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
a160: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
a170: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
a180: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
a190: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
a1a0: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
a1b0: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
a1c0: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
a1d0: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
a1e0: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
a1f0: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
a200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
a210: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
a220: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
a230: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
a240: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
a250: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
a260: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
a270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
a280: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
a290: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
a2a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
a2b0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
a2c0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
a2d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
a2e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
a2f0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a300: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a310: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a320: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
a330: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
a340: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  e );.  assert( (
a360: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
a370: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a380: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a390: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a3a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a3b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a3c0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a3d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a3e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a3f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a400: 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
a410: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a420: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a430: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a440: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a450: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a460: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a470: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a480: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a490: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a4a0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a4b0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a4c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a4d0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a4e0: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a4f0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a500: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a510: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a520: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a530: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a540: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a550: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a560: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a570: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a580: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a590: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a5a0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a5b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a5c0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a5d0: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a5e0: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a5f0: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a600: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a610: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a620: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
a630: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
a640: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
a650: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
a660: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
a670: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
a680: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a690: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
a6a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a6b0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a6c0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
a6d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a6e0: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
a6f0: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
a700: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a710: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a720: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
a730: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
a740: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
a750: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a770: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a780: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
a790: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
a7a0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
a7b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a7c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a7d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
a7e0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
a7f0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
a800: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
a810: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
a820: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
a830: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
a840: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a850: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
a860: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
a870: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
a880: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
a890: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
a8a0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
a8b0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
a8c0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
a8d0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
a8e0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
a8f0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
a900: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
a910: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
a920: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a930: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
a940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a950: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a960: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a970: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a980: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a990: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9a0: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a9b0: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a9c0: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a9d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a9e0: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a9f0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
aa00: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
aa10: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
aa20: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
aa30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aa50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
aa60: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
aa70: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
aa80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa90: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
aaa0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
aab0: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
aac0: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
aad0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
aae0: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
aaf0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ab00: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
ab10: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
ab20: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
ab30: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
ab40: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
ab50: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
ab60: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
ab70: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
ab80: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ab90: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
aba0: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
abb0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
abc0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
abd0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
abe0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
abf0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ac00: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ac10: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ac20: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
ac30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ac40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
ac50: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
ac60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ac70: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
ac80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ac90: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
aca0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
acb0: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
acc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
acd0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ace0: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
acf0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ad00: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ad10: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ad20: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
ad30: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
ad40: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
ad50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
ad60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ad70: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
ad80: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ad90: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ada0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
adb0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
adc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
add0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ade0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
adf0: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ae00: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ae10: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ae20: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
ae30: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
ae40: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
ae50: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
ae60: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
ae70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ae80: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
ae90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
aea0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
aeb0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
aec0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
aed0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
aee0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
aef0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
af00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
af10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
af20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
af30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
af40: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
af50: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
af60: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
af70: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
af80: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
af90: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
afa0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
afb0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
afc0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
afd0: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
afe0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
aff0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b000: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
b010: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
b020: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b030: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b040: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
b050: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b060: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
b070: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
b080: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b090: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b0a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b0b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b0c0: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b0d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b0e0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b0f0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b100: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b110: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b130: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b150: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b160: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b170: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b180: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b190: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b1a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b1b0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b1c0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b1d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b1e0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b1f0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b200: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b210: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b220: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b230: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b240: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b250: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b260: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b270: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b280: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b290: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b2a0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b2c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b2d0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b2e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b2f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b300: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b310: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b320: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b330: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b340: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b350: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b360: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b370: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b390: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b3b0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b3c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b3d0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b3e0: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b3f0: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b400: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b420: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b430: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b440: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b450: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b460: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b470: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b480: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b490: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b4a0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b4b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b4c0: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b4d0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b4e0: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b4f0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b500: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b510: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b520: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b530: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b540: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b550: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b560: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b570: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b580: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b590: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b5a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b5b0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b5c0: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b5d0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b5e0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b5f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b600: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b610: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b620: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b630: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b640: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b650: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b660: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b670: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b680: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b690: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b6a0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b6b0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b6c0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b6d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b6e0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b6f0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b700: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b710: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b720: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b730: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b740: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b750: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b760: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b770: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b780: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b790: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b7a0: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b7b0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b7c0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b7d0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b7e0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b7f0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b800: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b810: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b820: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b830: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b840: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b850: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b860: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b870: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b880: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b890: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b8a0: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b8b0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b8c0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b8e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b900: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b910: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b920: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b930: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b940: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b950: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b960: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b970: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b980: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b990: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b9a0: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b9b0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b9c0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b9d0: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b9e0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b9f0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
ba00: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
ba10: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
ba20: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
ba30: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
ba40: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
ba50: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
ba60: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
ba70: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
ba80: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
ba90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
baa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
bab0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
bac0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
bad0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
bae0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
baf0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
bb00: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
bb10: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
bb20: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
bb30: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bb40: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bb50: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bb60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bb70: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
bb80: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bb90: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bba0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bbb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bbc0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bbd0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bbe0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bbf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc00: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bc10: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bc20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bc30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bc40: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bc50: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bc60: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bc70: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bc80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc90: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bca0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bcb0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bce0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bcf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bd00: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bd10: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bd20: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bd30: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bd40: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bd50: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bd60: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bd70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bd80: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
bd90: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
bda0: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
bdb0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bdc0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bdd0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bde0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bdf0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
be00: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
be10: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
be20: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
be30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
be50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
be60: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
be70: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
be80: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
be90: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bea0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
beb0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bec0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bed0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bee0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bef0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bf00: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bf10: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bf20: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bf30: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bf40: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bf50: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bf60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bf70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bf80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bf90: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bfa0: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bfb0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bfc0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bfd0: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bfe0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bff0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c000: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c010: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c020: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c030: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c040: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c050: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c060: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c070: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c080: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c090: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c0a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c0b0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c0c0: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c0d0: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c0e0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c0f0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c100: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c110: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c120: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c130: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c140: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c150: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c160: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c170: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c180: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c190: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c1a0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c1b0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c1c0: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c1d0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c1e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c1f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c200: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c210: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c220: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c230: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c240: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c250: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c270: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c280: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c290: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c2a0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c2b0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c2c0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c2d0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c2e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c2f0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c310: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c320: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c330: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c350: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c360: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c370: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c380: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c390: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c3a0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c3b0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c3c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c3d0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c3e0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c410: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c420: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c430: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c440: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c450: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c460: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c470: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c480: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c490: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c4a0: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c4b0: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c4c0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c4d0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c4e0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c4f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c500: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c510: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c520: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c530: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c540: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c550: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c560: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c570: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c580: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c590: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c5a0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c5b0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c5c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c5d0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c5e0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c5f0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c600: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c610: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c620: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c630: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c640: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c650: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c660: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c670: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c680: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c690: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c6a0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c6b0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c6c0: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c6d0: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c6e0: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c6f0: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c700: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c710: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c720: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c730: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c740: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c750: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c760: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c770: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c780: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c790: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c7a0: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c7b0: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c7c0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c7d0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c7e0: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c7f0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c800: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c810: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c820: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c830: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c840: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c860: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c870: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c880: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c890: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c8a0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c8b0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c8c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c8d0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c8e0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c8f0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c900: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c910: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c920: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c930: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c940: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c950: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c960: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c970: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c980: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c990: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c9a0: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c9b0: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c9c0: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c9d0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c9e0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c9f0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
ca00: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
ca10: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ca20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ca30: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
ca40: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
ca50: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
ca60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
ca70: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
ca80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
ca90: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
caa0: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
cab0: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
cac0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
cad0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
cae0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
caf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cb00: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
cb10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cb20: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
cb30: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cb40: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cb50: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cb60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cb70: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
cb80: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cb90: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cba0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cbb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cbc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cbd0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cbe0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cbf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cc00: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cc10: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cc20: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cc30: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
cc40: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cc50: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc60: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc70: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
cc80: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cc90: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cca0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
ccb0: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
ccc0: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
ccd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cce0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
ccf0: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cd00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cd10: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cd20: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cd30: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
cd40: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
cd50: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cd60: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cd70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cd80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
cda0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
cdb0: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
cdc0: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
cdd0: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
cde0: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
cdf0: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
ce00: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
ce10: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ce20: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
ce30: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
ce40: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
ce50: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
ce60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
ce70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
ce80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
ce90: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
cea0: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
ceb0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
cec0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
ced0: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
cee0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
cef0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
cf00: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
cf10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
cf20: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cf30: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
cf40: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cf50: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cf60: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cf70: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cf80: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
cf90: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
cfa0: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
cfb0: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
cfc0: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
cfd0: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
cfe0: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
cff0: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
d000: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
d010: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
d020: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
d030: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
d040: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d050: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d060: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
d070: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
d080: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d090: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d0a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d0b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d0c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d0d0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d0e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d0f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d100: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d110: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d120: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d130: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d150: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d160: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d170: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d190: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d1a0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d1b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d1d0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d1e0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d1f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d200: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d210: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d220: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d230: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d240: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d250: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d260: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d270: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d280: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d290: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d2a0: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d2b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d2c0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d2d0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d2e0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d2f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d300: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d310: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d320: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d330: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d340: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d350: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d360: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d370: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d380: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d390: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d3a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d3b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d3c0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d3d0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d3e0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d3f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d400: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d410: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d420: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d430: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d440: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d450: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d460: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d470: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d480: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d490: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d4a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d4b0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d4c0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d4d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d4e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d4f0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d500: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d510: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d520: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d530: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d540: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d560: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d570: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d580: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d590: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d5a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d5b0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d5c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d5d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d5e0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d5f0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d600: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d620: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d630: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d640: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d650: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d660: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d670: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d680: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d690: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d6a0: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d6b0: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d6c0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d6d0: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d6e0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d6f0: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d700: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d710: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d720: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d730: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d740: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d750: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d760: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d770: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d780: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d790: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d7a0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d7b0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d7c0: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d7d0: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d7e0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d7f0: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d800: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d810: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d820: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d830: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d840: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d850: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d860: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d870: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d880: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d890: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d8a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d8b0: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d8d0: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d8e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d8f0: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d900: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d910: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d920: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d930: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d950: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d960: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d970: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d990: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d9a0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
d9b0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
d9c0: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
d9d0: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
d9e0: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
d9f0: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
da00: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
da10: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
da20: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
da30: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
da40: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
da50: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
da60: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
da70: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
da80: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
da90: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
daa0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
dab0: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
dac0: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
dad0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
dae0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
daf0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
db00: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
db10: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
db20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
db30: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
db40: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
db50: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
db60: 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ts.** BTREE_OMIT
db70: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
db80: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
db90: 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f  K.  The BTREE_NO
dba0: 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74  _READLOCK.** bit
dbb0: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20   is also set if 
dbc0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  the SQLITE_NoRea
dbd0: 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73  dlock flags is s
dbe0: 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  et in db->flags.
dbf0: 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 20  .** These flags 
dc00: 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
dc10: 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 50  gh into sqlite3P
dc20: 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 6d  agerOpen() and m
dc30: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61  ust.** be the sa
dc40: 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41 47  me values as PAG
dc50: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
dc60: 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
dc70: 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  DLOCK..**.** If 
dc80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dc90: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
dca0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
dcb0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
dcc0: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
dcd0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
dce0: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
dcf0: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
dd00: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
dd10: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
dd20: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
dd30: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
dd40: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
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 20  base connection 
dd70: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
dd80: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
dd90: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
dda0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
ddb0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
ddc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
ddd0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
dde0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
ddf0: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
de00: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
de10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
de20: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
de30: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
de40: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
de50: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
de60: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
de70: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
de80: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
de90: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
deb0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
dec0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
ded0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
dee0: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
def0: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
df00: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
df10: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
df20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
df30: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
df40: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
df50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
df60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
df70: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
df80: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
df90: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
dfc0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
dfd0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
dfe0: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
dff0: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
e000: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
e010: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
e020: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e040: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
e050: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
e060: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
e090: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
e0a0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
e0b0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
e0c0: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
e0d0: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
e0e0: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
e0f0: 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
e100: 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
e110: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
e120: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
e130: 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
e140: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
e150: 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
e160: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
e170: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
e180: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
e190: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
e1a0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
e1b0: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
e1c0: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
e1d0: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
e1e0: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
e1f0: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
e200: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
e210: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
e220: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
e230: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
e240: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
e250: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e260: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
e270: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e280: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e290: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
e2a0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
e2b0: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
e2c0: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
e2d0: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
e2e0: 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
e2f0: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
e300: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
e310: 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
e340: 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
e350: 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a 20 20  nMemory(db));.  
e360: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
e370: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
e380: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e390: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
e3a0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
e3b0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78  ssert( (flags&0x
e3c0: 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20  ff)==flags );   
e3d0: 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20  /* flags fit in 
e3e0: 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  8 bits */..  /* 
e3f0: 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e  Only a BTREE_SIN
e400: 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e  GLE database can
e410: 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45   be BTREE_UNORDE
e420: 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  RED */.  assert(
e430: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
e440: 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c  UNORDERED)==0 ||
e450: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
e460: 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20  SINGLE)!=0 );.. 
e470: 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47   /* A BTREE_SING
e480: 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61  LE database is a
e490: 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72  lways a temporar
e4a0: 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72  y and/or ephemer
e4b0: 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
e4c0: 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
e4d0: 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54  INGLE)==0 || isT
e4e0: 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  empDb );..  if( 
e4f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
e500: 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  TE_NoReadlock ){
e510: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
e520: 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b  REE_NO_READLOCK;
e530: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 65 6d  .  }.  if( isMem
e540: 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  db ){.    flags 
e550: 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b  |= BTREE_MEMORY;
e560: 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46  .  }.  if( (vfsF
e570: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e580: 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26  EN_MAIN_DB)!=0 &
e590: 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73  & (isMemdb || is
e5a0: 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76  TempDb) ){.    v
e5b0: 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
e5c0: 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
e5d0: 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
e5e0: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
e5f0: 42 3b 0a 20 20 7d 0a 20 20 70 56 66 73 20 3d 20  B;.  }.  pVfs = 
e600: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20  db->pVfs;.  p = 
e610: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e620: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
e630: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
e640: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e650: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
e660: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
e670: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
e680: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
e690: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e6a0: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
e6b0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
e6c0: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
e6d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
e6e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e6f0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e700: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e710: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e720: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
e730: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
e740: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
e750: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
e760: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
e770: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
e780: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
e790: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
e7a0: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
e7b0: 3d 30 20 26 26 20 69 73 54 65 6d 70 44 62 3d 3d  =0 && isTempDb==
e7c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  0 ){.    if( vfs
e7d0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
e7e0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
e7f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
e800: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
e810: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
e820: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
e830: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e840: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
e850: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e860: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e870: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
e880: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
e890: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
e8a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e8b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e8c0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
e8d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e8e0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
e8f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
e900: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
e910: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
e920: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
e930: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e940: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
e950: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
e960: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
e970: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
e980: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e990: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
e9a0: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
e9b0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e9c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e9d0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
e9e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e9f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
ea00: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
ea10: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
ea20: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ea30: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ea40: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
ea50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
ea60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
ea70: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
ea80: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
ea90: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
eaa0: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
eab0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
eae0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
eaf0: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
eb00: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
eb10: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
eb20: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
eb30: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
eb40: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
eb50: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
eb60: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
eb70: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
eb80: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
eb90: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ebb0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ebc0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ebe0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ebf0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ec00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ec10: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ec20: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ec30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ec40: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ec50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ec60: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ec70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ec80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec90: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
eca0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
ecb0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
ecc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ecd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ece0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ecf0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
ed00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ed10: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ed20: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
ed30: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ed40: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
ed50: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
ed60: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
ed70: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
ed80: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
ed90: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
eda0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
edb0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
edc0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
edd0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
ede0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
edf0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
ee00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ee10: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
ee20: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
ee30: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
ee40: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
ee50: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
ee60: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
ee70: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
ee80: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
ee90: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
eea0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
eeb0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
eec0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
eed0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
eee0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
eef0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
ef00: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
ef10: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
ef20: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
ef30: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
ef40: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
ef50: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
ef60: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ef70: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
ef80: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
ef90: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efa0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
efb0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
efc0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
efd0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
efe0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
eff0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
f000: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f010: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
f020: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f030: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f040: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f050: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f060: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f070: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f080: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f090: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f0a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f0b0: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f0c0: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f0d0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f0f0: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f100: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f110: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f120: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f130: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f140: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
f150: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
f160: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
f170: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
f180: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f190: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f1a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f1b0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
f1c0: 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
f1d0: 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
f1e0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
f1f0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
f200: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
f210: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
f220: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
f230: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
f240: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
f250: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
f260: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
f270: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
f280: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
f290: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
f2a0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
f2b0: 67 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ger);.#ifdef SQL
f2c0: 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
f2d0: 45 0a 20 20 20 20 70 42 74 2d 3e 73 65 63 75 72  E.    pBt->secur
f2e0: 65 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e  eDelete = 1;.#en
f2f0: 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  dif.    pBt->pag
f300: 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
f310: 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
f320: 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
f330: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
f340: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
f350: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
f360: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
f370: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
f380: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
f390: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
f3a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
f3b0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
f3c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f3d0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f3e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
f3f0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
f400: 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
f410: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
f420: 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
f430: 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
f440: 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
f450: 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
f460: 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
f470: 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
f480: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f490: 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
f4a0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
f4b0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
f4c0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
f4d0: 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
f4e0: 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
f4f0: 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
f500: 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
f510: 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
f520: 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
f530: 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
f540: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
f550: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
f560: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
f570: 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
f580: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
f590: 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
f5a0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
f5b0: 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
f5c0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f5d0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
f5e0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
f5f0: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
f600: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f610: 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
f620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
f630: 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
f640: 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
f650: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
f660: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
f670: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f680: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
f690: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
f6a0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
f6b0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
f6c0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
f6d0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
f6e0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
f6f0: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
f700: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
f710: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f720: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
f730: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
f740: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
f750: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
f760: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
f770: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
f780: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
f790: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f7a0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
f7b0: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
f7c0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
f7d0: 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
f7e0: 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
f7f0: 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
f800: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f810: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f820: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f830: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f840: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
f850: 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
f860: 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
f870: 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
f880: 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
f890: 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
f8a0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ble ){.      sql
f8b0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
f8c0: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
f8d0: 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
f8e0: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
f8f0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f900: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f910: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
f920: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
f930: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
f940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
f950: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
f960: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
f970: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
f980: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f990: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
f9a0: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
f9b0: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
f9c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f9d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
f9e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f9f0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
fa00: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
fa10: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
fa20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
fa30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fa40: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
fa50: 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
fa60: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
fa70: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fa80: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
fa90: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
faa0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fab0: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
fac0: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
fad0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
fae0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
faf0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
fb00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fb10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
fb20: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
fb30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
fb40: 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
fb50: 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
fb60: 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
fb70: 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
fb80: 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
fb90: 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
fba0: 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
fbb0: 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
fbc0: 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
fbd0: 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
fbe0: 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
fbf0: 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
fc00: 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
fc10: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
fc20: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
fc30: 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
fc40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
fc50: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
fc60: 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
fc70: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
fc80: 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
fc90: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
fca0: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
fcb0: 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
fcc0: 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
fcd0: 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
fce0: 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
fcf0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
fd00: 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
fd10: 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
fd20: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
fd30: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
fd40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fd50: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
fd60: 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
fd70: 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
fd80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
fd90: 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
fda0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
fdb0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fdc0: 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
fdd0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
fde0: 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
fdf0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
fe00: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
fe10: 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
fe20: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
fe30: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
fe40: 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
fe50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fe60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
fe70: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
fe80: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
fe90: 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
fea0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
feb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
fec0: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
fed0: 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
fee0: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
fef0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
ff00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
ff10: 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
ff20: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
ff30: 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
ff40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ff50: 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
ff60: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
ff70: 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
ff80: 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
ff90: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
ffa0: 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
ffb0: 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
ffc0: 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
ffd0: 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
ffe0: 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
fff0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
10000 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
10010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
10020 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
10030 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
10040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
10050 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
10060 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
10070 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
10080 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
10090 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
100a0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
100b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
100c0 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
100d0 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
100e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
100f0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
10100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10110 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
10120 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
10130 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
10140 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
10150 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
10160 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
10170 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
10180 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
10190 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
101a0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
101b0 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
101c0 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
101d0 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
101e0 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
101f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
10200 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
10210 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
10220 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10230 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
10240 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  CHE.  sqlite3_mu
10250 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  tex *pMaster;.  
10260 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
10270 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
10280 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
10290 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
102a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
102b0 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   );.  pMaster = 
102c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
102d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
102e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
102f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10300 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
10310 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
10320 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10330 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10340 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10350 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10360 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
10370 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
10380 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10390 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
103a0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
103b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
103c0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
103d0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
103e0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
103f0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
10400 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
10410 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
10420 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10430 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10440 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10450 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10460 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10470 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10480 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10490 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
104a0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
104b0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
104c0 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
104d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
104e0 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
104f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10500 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
10510 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
10520 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10530 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10540 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10550 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10560 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10570 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10580 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
10590 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
105a0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
105b0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
105c0 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
105d0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
105e0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
105f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
10600 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
10610 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
10620 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
10630 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
10640 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10650 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10660 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10670 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10680 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
10690 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
106a0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
106b0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
106c0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
106d0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
106e0 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
106f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10700 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
10710 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10720 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10730 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10740 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10750 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10760 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10780 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
10790 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
107a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
107b0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
107c0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
107d0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
107e0 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
107f0 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
10800 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
10810 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
10820 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10830 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10840 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10850 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10860 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10880 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10890 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
108a0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
108b0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
108c0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
108d0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
108e0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
108f0 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10900 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10910 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
10920 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
10930 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10940 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
10950 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
10960 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
10970 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
10980 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
10990 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
109a0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
109b0 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
109c0 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
109d0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
109e0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
109f0 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
10a00 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
10a10 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
10a20 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10a30 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10a40 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
10a50 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
10a60 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
10a70 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
10a80 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
10a90 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
10aa0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
10ab0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
10ac0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
10ad0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10af0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10b00 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10b10 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10b20 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10b30 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10b40 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
10b50 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
10b60 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
10b70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
10b80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
10b90 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
10ba0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
10bb0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10bc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10bd0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
10be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10bf0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
10c00 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10c10 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
10c20 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
10c30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
10c40 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
10c50 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10c60 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10c70 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10c80 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
10c90 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
10ca0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
10cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10cc0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10cd0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
10ce0 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
10cf0 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
10d00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
10d10 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10d20 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
10d30 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
10d40 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
10d50 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
10d60 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10d70 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
10d80 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
10d90 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
10da0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
10db0 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
10dc0 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
10dd0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
10de0 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
10df0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
10e00 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
10e10 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
10e20 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
10e30 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
10e40 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
10e50 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
10e60 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
10e70 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
10e80 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
10e90 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
10ea0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
10eb0 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
10ec0 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
10ed0 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
10ee0 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
10ef0 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
10f00 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
10f10 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
10f20 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
10f30 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
10f40 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
10f50 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
10f60 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
10f70 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
10f80 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
10f90 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
10fa0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
10fb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10fc0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10fd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10fe0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10ff0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11000 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11010 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
11020 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
11030 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
11040 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11050 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11060 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11070 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11080 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
11090 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
110a0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
110b0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
110c0 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
110d0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
110e0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
110f0 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
11100 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
11110 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
11120 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
11130 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
11140 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11150 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11160 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11170 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11180 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
11190 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
111a0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
111b0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
111c0 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
111d0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
111e0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
111f0 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
11200 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
11210 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
11220 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
11230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
11240 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11250 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11260 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
11270 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
11280 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
11290 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
112a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
112b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
112c0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
112d0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
112e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
112f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
11300 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
11310 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
11320 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71   fullSync);.  sq
11330 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11340 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11350 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11360 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11370 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11380 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11390 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
113a0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
113b0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
113c0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
113d0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
113e0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
113f0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
11400 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
11410 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11420 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
11430 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
11440 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11450 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11460 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11470 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11480 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11490 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
114a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
114b0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
114c0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
114d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
114e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
114f0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
11500 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
11510 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
11520 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
11530 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61  ACUUM)./*.** Cha
11540 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
11550 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
11560 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
11570 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
11580 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
11590 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
115a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
115b0 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
115c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
115d0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
115e0 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
115f0 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
11600 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
11610 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
11620 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
11630 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
11640 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
11650 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
11660 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
11670 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
11680 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
11690 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
116a0 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
116b0 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
116c0 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
116d0 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
116e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
116f0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
11700 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
11710 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
11720 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
11730 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
11740 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
11750 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
11760 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
11770 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
11780 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
11790 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
117a0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
117b0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
117c0 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
117d0 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
117e0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
117f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
11800 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
11810 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20  eSizeFixed flag 
11820 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
11830 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
11840 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
11850 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
11860 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
11870 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11880 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
11890 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
118a0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
118b0 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
118c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
118d0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
118e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
118f0 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
11900 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
11910 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
11920 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11930 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
11940 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
11950 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11960 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
11970 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
11980 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
11990 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
119a0 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
119b0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
119c0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
119d0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
119e0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
119f0 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
11a00 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11a10 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
11a20 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
11a30 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
11a40 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
11a50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
11a60 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
11a70 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
11a80 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
11a90 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
11aa0 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
11ab0 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
11ac0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
11ad0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
11ae0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
11af0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
11b00 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
11b10 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
11b20 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
11b30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
11b40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
11b50 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
11b60 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
11b70 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
11b80 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   1;.  sqlite3Btr
11b90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11ba0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11bb0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
11bc0 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
11bd0 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
11be0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
11bf0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
11c00 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
11c10 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
11c20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
11c40 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
11c50 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
11c60 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
11c70 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
11c80 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
11c90 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
11ca0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
11cb0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
11cc0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
11cd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11ce0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
11cf0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
11d00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11d10 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
11d20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
11d30 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
11d40 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
11d50 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11d60 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
11d70 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
11d80 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
11d90 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
11da0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
11db0 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
11dc0 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
11dd0 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
11de0 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
11df0 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
11e00 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
11e10 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
11e20 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
11e30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11e40 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
11e50 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
11e60 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
11e70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11e80 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
11e90 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
11ea0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
11eb0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
11ec0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11ed0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
11ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11ef0 65 20 73 65 63 75 72 65 44 65 6c 65 74 65 20 66  e secureDelete f
11f00 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
11f10 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
11f20 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
11f30 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
11f40 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
11f50 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
11f60 66 20 74 68 65 20 73 65 63 75 72 65 44 65 6c 65  f the secureDele
11f70 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66  te.** setting af
11f80 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a  ter the change..
11f90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11fa0 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
11fb0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
11fc0 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
11fd0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
11fe0 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
11ff0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12000 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
12010 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
12020 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d 20 28  secureDelete = (
12030 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20 31 20  newFlag!=0) ? 1 
12040 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  : 0;.  } .  b = 
12050 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65  p->pBt->secureDe
12060 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  lete;.  sqlite3B
12070 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12080 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64  return b;.}.#end
12090 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
120a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
120b0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
120c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
120d0 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
120e0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
120f0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
12100 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
12110 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
12120 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
12130 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
12140 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
12150 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
12160 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
12170 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
12180 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
12190 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
121a0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
121b0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
121c0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
121d0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
121e0 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
121f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
12200 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
12210 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
12220 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
12230 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12240 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
12250 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12260 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
12270 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12290 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
122a0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
122b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
122c0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
122d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
122e0 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  d && (av ?1:0)!=
122f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
12300 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12310 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
12320 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
12330 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
12340 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
12350 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
12360 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
12370 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12380 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12390 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
123a0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
123b0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
123c0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
123d0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
123e0 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
123f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
12400 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
12410 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12420 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
12430 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
12440 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12450 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
12460 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
12470 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
12480 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
12490 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
124a0 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
124b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
124c0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
124d0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
124e0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
124f0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
12500 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
12510 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
12520 0a 20 20 29 3b 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 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
12560 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
12570 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
12580 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
12590 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
125a0 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
125b0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
125c0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
125d0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
125e0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
125f0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
12600 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
12610 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
12620 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
12630 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
12640 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
12650 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
12660 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
12670 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
12680 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
12690 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
126a0 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
126b0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
126c0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
126d0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
126e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
126f0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
12700 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
12710 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
12720 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
12730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12740 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
12750 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
12760 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
12770 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12780 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
12790 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
127a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
127b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
127c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
127d0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
127e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
127f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
12800 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
12810 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
12820 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12830 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12840 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12850 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
12860 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
12870 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
12880 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
12890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
128a0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
128b0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
128c0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
128d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
128e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
128f0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
12900 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
12910 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
12920 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
12930 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
12940 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
12950 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
12960 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
12970 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
12980 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
12990 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
129a0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
129b0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
129c0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
129d0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
129e0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
129f0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
12a00 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
12a10 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
12a20 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
12a30 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
12a40 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
12a50 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
12a60 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
12a70 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
12a80 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
12a90 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
12aa0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
12ab0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
12ac0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
12ad0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12ae0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
12af0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12b00 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
12b10 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
12b20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
12b30 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
12b40 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
12b50 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
12b60 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12b70 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
12b80 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
12b90 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
12ba0 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
12bb0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
12bc0 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
12bd0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12be0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
12bf0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
12c00 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
12c10 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
12c20 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
12c30 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
12c40 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
12c50 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
12c60 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
12c70 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
12c80 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
12c90 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
12ca0 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
12cb0 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
12cc0 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
12cd0 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
12ce0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
12cf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
12d00 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
12d10 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
12d20 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
12d30 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
12d40 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
12d50 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
12d60 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
12d70 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
12d80 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
12d90 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
12da0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
12db0 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
12dc0 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d 3e 64  19]==2 && pBt->d
12dd0 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20 29 7b  oNotUseWAL==0 ){
12de0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
12df0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
12e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
12e10 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
12e20 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
12e30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12e50 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12e60 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
12e70 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d  lse if( isOpen==
12e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
12e90 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
12ea0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12eb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12ec0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
12ed0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
12ee0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
12ef0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
12f00 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
12f10 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
12f20 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
12f30 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
12f40 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
12f50 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
12f60 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
12f70 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
12f80 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
12f90 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
12fa0 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
12fb0 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
12fc0 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
12fd0 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
12fe0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
12ff0 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
13000 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
13010 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
13020 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
13030 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
13040 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13050 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
13060 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
13070 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
13080 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
13090 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
130a0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
130b0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
130c0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
130d0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
130e0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
130f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13100 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13110 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
13120 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
13130 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
13140 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
13150 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
13160 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
13170 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
13180 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
13190 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
131a0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
131b0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
131c0 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
131d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
131e0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
131f0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
13200 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
13210 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
13220 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
13230 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
13240 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
13250 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
13260 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
13270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13280 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
13290 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
132a0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
132b0 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
132c0 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
132d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
132e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
132f0 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
13300 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
13310 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
13320 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
13330 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
13340 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
13350 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13360 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
13370 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
13380 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
13390 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
133c0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
133d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
133e0 20 7d 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65   }.    if( nPage
133f0 48 65 61 64 65 72 3e 6e 50 61 67 65 46 69 6c 65  Header>nPageFile
13400 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13410 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13420 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
13430 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13450 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
13460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13470 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13480 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
13490 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
134a0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
134b0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
134c0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
134d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
134e0 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
134f0 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
13500 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
13510 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
13520 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13530 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
13540 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
13550 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
13560 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
13570 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
13580 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
13590 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
135a0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
135b0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
135c0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
135d0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
135e0 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
135f0 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
13600 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
13610 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
13620 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
13630 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
13640 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
13650 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
13660 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
13670 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13680 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
13690 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
136a0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
136b0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
136c0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
136d0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
136e0 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
136f0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
13700 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
13710 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
13720 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
13730 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
13740 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
13750 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
13760 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
13770 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
13780 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
13790 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
137a0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
137b0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
137c0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
137d0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
137e0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
137f0 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
13800 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
13810 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
13820 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
13830 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
13840 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
13850 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
13860 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
13870 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
13880 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 61  2/255 - 23);.  a
13890 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
138a0 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
138b0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
138c0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
138d0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
138e0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
138f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13900 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
13910 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
13920 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
13930 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
13940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13950 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
13960 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
13970 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
13980 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
13990 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
139a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
139b0 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
139c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
139d0 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
139e0 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
139f0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
13a00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13a10 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
13a20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
13a30 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
13a40 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
13a50 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
13a60 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
13a70 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
13a80 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
13a90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13aa0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
13ab0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
13ac0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
13ad0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13ae0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
13af0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
13b00 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74  Cursor==0 || pBt
13b10 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
13b20 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
13b30 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
13b40 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
13b50 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
13b60 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  1!=0 ){.    asse
13b70 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
13b80 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
13b90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13ba0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
13bb0 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
13bc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
13bd0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
13be0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13bf0 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
13c00 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13c10 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
13c20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
13c30 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
13c40 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
13c50 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
13c60 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
13c70 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
13c80 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
13c90 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
13ca0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
13cb0 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
13cc0 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
13cd0 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
13ce0 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
13cf0 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
13d00 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
13d10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13d20 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13d30 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
13d40 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
13d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13d60 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
13d70 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
13d80 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
13d90 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
13da0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
13db0 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
13dc0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
13dd0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13de0 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
13df0 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
13e00 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
13e10 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
13e20 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
13e30 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
13e40 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
13e50 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
13e60 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
13e70 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
13e80 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
13e90 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
13ea0 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
13eb0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
13ec0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
13ed0 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
13ee0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
13ef0 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
13f00 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
13f10 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
13f20 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
13f30 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
13f40 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
13f50 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
13f60 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
13f70 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
13f80 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
13f90 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
13fa0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
13fb0 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
13fc0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
13fd0 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
13fe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13ff0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
14000 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
14010 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
14020 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
14030 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
14040 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
14050 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
14060 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
14070 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
14080 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
14090 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
140a0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
140b0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
140c0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
140d0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
140e0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
140f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14100 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
14110 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
14120 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
14130 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
14140 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
14150 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14160 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
14170 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
14180 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
14190 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
141a0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
141b0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
141c0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
141d0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
141e0 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
141f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
14200 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
14210 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
14220 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
14230 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
14240 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
14250 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
14260 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
14270 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
14280 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
14290 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
142a0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
142b0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
142c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
142d0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
142e0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
142f0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
14300 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
14310 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
14320 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
14330 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
14340 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
14350 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
14360 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
14370 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
14380 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
14390 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
143a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
143b0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
143c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
143d0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
143e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
143f0 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
14400 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14410 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
14420 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
14430 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
14440 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
14450 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
14460 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
14470 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
14480 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
14490 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
144a0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
144b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
144c0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
144d0 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
144e0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
144f0 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
14500 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
14510 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
14520 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
14530 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
14540 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
14550 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
14560 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
14570 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
14580 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
14590 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
145a0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
145b0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
145c0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
145d0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
145e0 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
145f0 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
14600 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
14610 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
14620 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
14630 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
14640 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
14650 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
14660 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
14670 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
14680 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
14690 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
146a0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
146b0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
146c0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
146d0 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
146e0 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
146f0 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
14700 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
14710 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
14720 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
14730 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
14740 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
14750 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
14760 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
14770 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
14780 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
14790 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
147a0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
147b0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
147c0 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
147d0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
147e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
147f0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
14800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14810 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
14820 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
14830 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
14840 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
14850 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
14860 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
14870 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
14880 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
14890 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
148a0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
148b0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
148c0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
148d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
148e0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
148f0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
14900 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
14910 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
14920 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
14930 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
14940 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
14950 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
14960 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
14970 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
14980 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42  base */.  if( pB
14990 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
149a0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
149b0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
149c0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
149d0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
149e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
149f0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
14a00 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
14a10 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
14a20 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
14a30 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
14a40 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
14a50 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
14a60 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
14a70 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
14a80 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
14a90 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
14aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
14ab0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77  D..  */.  if( (w
14ac0 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
14ad0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14ae0 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74  NS_WRITE) || pBt
14af0 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20  ->isPending ){. 
14b00 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
14b10 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
14b20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
14b30 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
14b40 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
14b50 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
14b60 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
14b70 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
14b80 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
14b90 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
14ba0 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
14bb0 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
14bc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14be0 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29  }.  if( pBlock )
14bf0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
14c00 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
14c10 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
14c20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
14c30 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
14c40 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  E;.    goto tran
14c50 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e  s_begun;.  }.#en
14c60 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
14c70 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
14c80 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14c90 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
14ca0 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
14cb0 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
14cc0 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
14cd0 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
14ce0 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
14cf0 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
14d00 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
14d10 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
14d20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
14d30 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
14d40 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
14d50 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
14d60 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
14d70 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
14d80 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
14d90 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c  .  pBt->initiall
14da0 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28 70 42  yEmpty = (u8)(pB
14db0 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a 20 20  t->nPage==0);.  
14dc0 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
14dd0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
14de0 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
14df0 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
14e00 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
14e10 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
14e20 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
14e30 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
14e40 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
14e50 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
14e60 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
14e70 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
14e80 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
14e90 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
14ea0 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
14eb0 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
14ec0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
14ed0 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
14ee0 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
14ef0 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
14f00 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
14f10 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
14f20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
14f30 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
14f40 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
14f50 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
14f60 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
14f70 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
14f80 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
14f90 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
14fa0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
14fb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
14fc0 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
14fd0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
14fe0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14ff0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
15000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15020 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
15030 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
15040 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
15050 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
15060 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
15070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15080 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
15090 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
150a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
150b0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
150c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
150d0 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
150e0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
150f0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
15100 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
15110 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
15120 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
15130 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
15140 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
15150 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
15160 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
15170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15180 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
15190 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
151a0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
151b0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
151c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
151d0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
151e0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
151f0 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c  ){..assert( p->l
15200 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
15210 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
15220 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
15230 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
15240 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
15250 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
15260 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
15270 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
15280 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
15290 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
152a0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
152b0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
152c0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
152d0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
152e0 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
152f0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
15300 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15310 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
15320 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
15330 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
15340 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
15350 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
15360 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15370 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
15390 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
153a0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
153b0 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
153c0 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
153d0 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b   (u8)(wrflag>1);
153e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
153f0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
15400 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
15410 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
15420 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
15430 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
15440 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
15450 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
15460 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
15470 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
15480 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
15490 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
154a0 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
154b0 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
154c0 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
154d0 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
154e0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
154f0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
15500 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
15510 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
15520 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
15530 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
15540 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
15550 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
15560 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
15570 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
15580 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
15590 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
155a0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
155b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
155c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
155d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
155e0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
155f0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
15600 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
15610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15620 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
15630 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
15640 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
15650 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
15660 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
15670 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
15680 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
15690 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
156a0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
156b0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
156c0 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
156d0 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
156e0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
156f0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
15700 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
15710 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
15720 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
15730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15740 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
15750 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
15760 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
15770 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
15780 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
15790 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
157a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
157b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
157c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
157d0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
157e0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
157f0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
15800 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
15810 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
15820 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
15830 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
15840 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
15850 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
15860 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
15870 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
15880 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
15890 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
158a0 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
158b0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
158c0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
158f0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
15900 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15930 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
15940 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
15950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15970 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15980 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15990 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
159a0 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
159b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
159c0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
159d0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
159e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
159f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
15a00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
15a10 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
15a20 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
15a30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15a40 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
15a50 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
15a60 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
15a70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
15a80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
15a90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
15aa0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
15ab0 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
15ac0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
15ad0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
15ae0 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
15af0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
15b00 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
15b10 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
15b20 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
15b30 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
15b40 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
15b50 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
15b60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15b70 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
15b80 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
15b90 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
15ba0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
15bb0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
15bc0 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
15bd0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
15be0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
15bf0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
15c00 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
15c10 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
15c20 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
15c30 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
15c40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
15c50 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
15c60 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
15c70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
15c80 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
15c90 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
15ca0 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
15cb0 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
15cc0 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
15cd0 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
15ce0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
15cf0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
15d00 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
15d10 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
15d20 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
15d30 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
15d40 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
15d60 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
15d70 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
15d80 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
15d90 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
15da0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
15db0 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
15de0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
15df0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
15e00 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
15e10 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
15e20 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
15e30 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
15e40 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
15e50 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
15e60 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
15e70 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
15e80 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
15e90 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
15ea0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
15eb0 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
15ec0 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
15ed0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
15ee0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15ef0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
15f00 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
15f10 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
15f20 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
15f30 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
15f40 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
15f50 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
15f60 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
15f70 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
15f80 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
15f90 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
15fa0 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
15fb0 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
15fc0 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
15fd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15fe0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15ff0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
16000 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
16010 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
16020 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
16030 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
16040 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
16050 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
16060 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
16070 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
16080 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
16090 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
160a0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
160b0 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
160c0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
160d0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
160e0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
160f0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
16100 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
16110 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
16120 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
16130 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
16140 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
16150 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
16160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
16170 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
16180 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
16190 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
161a0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
161b0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
161c0 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
161d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
161e0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
161f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
16210 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
16220 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
16230 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
16240 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
16250 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16270 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
16280 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
16290 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
162a0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
162b0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
162c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
162d0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
162e0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
162f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16300 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16320 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
16330 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
16340 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
16350 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
16360 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
16370 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
16380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16390 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
163a0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
163b0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
163c0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
163d0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
163e0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
163f0 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
16400 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
16410 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
16420 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
16430 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
16440 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
16450 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
16460 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
16470 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
16480 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
16490 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
164a0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
164b0 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
164c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
164d0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
164e0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
164f0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
16500 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
16510 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
16520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
16530 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
16540 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
16550 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
16560 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
16570 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
16580 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16590 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
165a0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
165b0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
165c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
165d0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
165e0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
165f0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16600 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
16610 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
16620 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
16630 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
16640 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
16650 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
16660 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
16670 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16680 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
16690 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
166a0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
166b0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
166c0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
166d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
166e0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
166f0 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
16700 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
16710 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
16720 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
16730 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
16740 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
16750 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
16760 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
16770 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
16780 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
16790 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
167a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
167b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
167c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
167d0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
167e0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
167f0 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
16800 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
16810 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
16820 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
16830 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
16840 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
16850 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
16860 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
16870 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
16880 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
16890 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
168a0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
168b0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
168c0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
168d0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
168e0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
168f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16900 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16910 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
16920 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
16930 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
16940 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
16950 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
16960 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
16970 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
16980 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
16990 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
169a0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
169b0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
169c0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
169d0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
169e0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
169f0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
16a00 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
16a10 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
16a20 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
16a30 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
16a40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
16a50 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
16a60 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
16a70 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
16a80 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
16a90 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
16aa0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
16ab0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
16ac0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
16ad0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
16ae0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
16af0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
16b00 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
16b10 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
16b20 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
16b30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16b40 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
16b50 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
16b60 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
16b70 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
16b80 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
16b90 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
16ba0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
16bb0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
16bc0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
16bd0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
16be0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
16bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16c10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16c20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16c30 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
16c40 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
16c50 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
16c60 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
16c70 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
16c80 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
16c90 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
16ca0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
16cb0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
16cc0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
16cd0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
16ce0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
16cf0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
16d00 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
16d10 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
16d20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
16d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16d50 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
16d60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16d70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
16d80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16da0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16db0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
16dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16dd0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
16de0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
16df0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
16e00 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
16e10 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
16e20 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
16e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16e40 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
16e50 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
16e60 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
16e70 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
16e80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
16e90 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
16ea0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
16eb0 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
16ec0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
16ed0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
16ee0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
16ef0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
16f00 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
16f10 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
16f20 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
16f30 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
16f40 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
16f50 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
16f60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
16f70 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
16f80 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
16f90 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
16fa0 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
16fb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
16fc0 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
16fd0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
16fe0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
16ff0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
17000 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
17010 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
17020 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
17030 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
17040 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
17050 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
17060 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
17070 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
17080 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
17090 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
170a0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
170b0 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
170c0 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
170d0 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
170e0 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
170f0 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
17100 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
17110 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
17120 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
17130 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
17140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17150 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
17160 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
17170 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
17180 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72    If nFin is zer
17190 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
171a0 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63   that.** incrVac
171b0 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62  uumStep() will b
171c0 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74  e called a finit
171d0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
171e0 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f  s.** which may o
171f0 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20  r may not empty 
17200 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41  the freelist.  A
17210 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d   full autovacuum
17220 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20  .** has nFin>0. 
17230 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65   A "PRAGMA incre
17240 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68  mental_vacuum" h
17250 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73  as nFin==0..*/.s
17260 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
17270 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
17280 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
17290 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
172a0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
172b0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
172c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
172d0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
172e0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
172f0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
17300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17310 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17320 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
17330 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
17340 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
17350 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
17360 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
17370 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
17380 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
17390 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
173a0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
173b0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
173c0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
173d0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
173e0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
173f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17400 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
17410 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
17420 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
17430 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
17440 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
17450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17460 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17470 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
17480 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
17490 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
174a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
174b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
174c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
174d0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
174e0 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
174f0 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
17500 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
17510 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
17520 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
17530 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
17540 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
17550 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
17560 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
17570 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
17580 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
17590 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
175a0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
175b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
175c0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
175d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
175e0 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
175f0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
17600 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
17610 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17620 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
17630 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
17640 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
17650 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
17660 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
17670 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
17680 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
17690 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
176a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
176b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
176c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
176d0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
176e0 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
176f0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17700 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
17710 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
17720 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
17730 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
17740 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
17750 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
17760 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
17770 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
17780 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
17790 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
177a0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
177b0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
177c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
177d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
177e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
177f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
17800 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
17810 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
17820 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
17830 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
17840 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
17850 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
17860 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
17870 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
17880 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17890 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
178a0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
178b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
178c0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
178d0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
178e0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
178f0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
17900 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
17910 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
17920 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
17930 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
17940 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
17950 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
17960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
17970 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
17980 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
17990 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
179a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
179b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
179c0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
179d0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
179e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
179f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17a00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17a10 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
17a20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
17a30 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
17a40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17a50 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
17a60 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
17a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17a80 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
17a90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
17aa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
17ac0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
17ad0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
17ae0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
17af0 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
17b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17b10 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
17b20 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
17b30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17b40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17b50 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17b60 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
17b70 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
17b80 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
17b90 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
17ba0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
17bb0 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
17bc0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
17bd0 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
17be0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
17bf0 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
17c00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
17c10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
17c20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
17c30 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30  iLastPg, &pPg, 0
17c40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17c50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17c60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17c70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
17c80 20 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 50  te3PagerWrite(pP
17ca0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
17cb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17cc0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69  (pPg);.        i
17cd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17cf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
17d00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
17d10 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
17d20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
17d30 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
17d40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61  pBt->pPager, iLa
17d50 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74 2d 3e  stPg);.    pBt->
17d60 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
17d70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17d80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17d90 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
17da0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
17db0 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
17dc0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
17dd0 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
17de0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
17df0 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
17e00 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
17e10 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
17e20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
17e30 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
17e40 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
17e50 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
17e60 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
17e70 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
17e80 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
17e90 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
17ea0 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
17eb0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17ec0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
17ed0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
17ee0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
17ef0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
17f00 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
17f10 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
17f20 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17f30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
17f40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
17f50 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
17f60 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
17f70 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
17f80 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
17f90 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
17fa0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
17fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
17fc0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
17fd0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
17fe0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
17ff0 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
18000 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c  cuumStep(pBt, 0,
18010 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
18020 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72  pBt));.    if( r
18030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18040 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18050 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
18060 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
18070 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
18080 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18090 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
180a0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  >nPage);.    }. 
180b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
180c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
180d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
180e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
180f0 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
18100 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
18110 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
18120 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
18130 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
18140 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
18150 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
18160 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18170 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
18180 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
18190 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
181a0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
181b0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
181c0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
181d0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
181e0 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
181f0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
18200 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
18210 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
18220 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
18230 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
18240 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
18250 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
18260 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
18270 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
18280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
18290 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
182a0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
182b0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
182c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
182d0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
182e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
182f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18300 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18310 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
18320 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
18330 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
18340 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
18350 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
18360 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
18370 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
18380 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
18390 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
183a0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
183b0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
183c0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
183d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
183e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
183f0 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
18400 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
18410 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
18420 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
18430 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
18440 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
18450 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
18460 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
18470 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  .    int nEntry;
18480 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18490 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
184a0 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
184b0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
184c0 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
184d0 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
184e0 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
184f0 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
18500 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
18510 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
18520 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
18530 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
18540 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18550 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
18560 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
18570 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
18580 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
18590 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
185a0 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
185b0 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
185c0 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
185d0 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
185e0 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
185f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
18600 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
18610 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
18620 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
18630 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18640 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
18650 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
18660 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18670 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
18680 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
18690 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e  bleSize/5;.    n
186a0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
186b0 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
186c0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
186d0 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
186e0 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
186f0 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
18700 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  ap;.    if( nOri
18710 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
18720 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
18730 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
18740 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
18750 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
18760 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
18770 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
18780 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
18790 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
187a0 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
187b0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
187c0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
187d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
187e0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  RUPT_BKPT;..    
187f0 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
18800 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
18810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
18820 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
18830 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
18840 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
18850 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
18860 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
18870 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
18880 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
18890 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
188a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
188b0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
188c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
188d0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
188e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
188f0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
18900 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18910 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
18920 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
18930 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18940 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
18950 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18960 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
18970 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e  Bt->pPager, nFin
18980 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
18990 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
189a0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
189b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
189c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
189d0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
189e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
189f0 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65  rt( nRef==sqlite
18a00 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
18a10 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
18a20 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
18a30 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
18a40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18a50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
18a60 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
18a70 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
18a80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18a90 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
18aa0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
18ab0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
18ac0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
18ad0 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
18ae0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
18af0 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
18b00 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
18b10 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
18b20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
18b30 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
18b40 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
18b50 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
18b60 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18b70 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
18b80 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
18b90 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
18ba0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
18bb0 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
18bc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18bd0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
18be0 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
18bf0 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
18c00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
18c10 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
18c20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
18c30 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
18c40 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
18c50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18c60 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
18c70 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
18c80 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
18c90 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
18ca0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
18cb0 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
18cc0 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
18cd0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
18ce0 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
18cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
18d00 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
18d10 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
18d20 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
18d30 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
18d40 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
18d50 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
18d60 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
18d70 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
18d80 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
18d90 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
18da0 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
18db0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
18dc0 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
18dd0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
18de0 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
18df0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
18e00 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
18e10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18e20 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
18e30 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
18e40 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
18e50 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
18e60 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
18e70 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
18e80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
18e90 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
18ea0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
18eb0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
18ec0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
18ed0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
18ee0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
18ef0 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
18f00 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
18f10 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
18f20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
18f30 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
18f40 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
18f50 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
18f60 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
18f70 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
18f80 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
18f90 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
18fa0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
18fb0 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
18fc0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
18fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18fe0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
18ff0 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
19000 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
19010 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19020 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
19030 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19040 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
19050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19060 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
19070 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19090 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
190a0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
190b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
190c0 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
190d0 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
190e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
190f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
19100 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19110 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
19120 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
19130 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
19140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19150 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
19160 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
19170 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
19180 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19190 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
191a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
191b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
191c0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
191d0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
191e0 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
191f0 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
19200 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
19210 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
19220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19230 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
19240 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
19250 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19260 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
19270 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
19280 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
19290 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61  ..  btreeClearHa
192a0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
192b0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
192c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d  TRANS_NONE && p-
192d0 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  >db->activeVdbeC
192e0 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  nt>1 ){.    /* I
192f0 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
19300 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
19310 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
19320 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
19330 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
19340 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
19350 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
19360 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
19370 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
19380 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
19390 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
193a0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
193b0 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
193c0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
193d0 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
193e0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
193f0 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
19400 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
19410 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
19420 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
19430 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
19440 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
19450 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
19460 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
19470 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
19480 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
19490 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
194a0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
194b0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
194c0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
194d0 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
194e0 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
194f0 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
19500 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
19510 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
19520 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
19530 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
19540 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
19550 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
19560 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
19570 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
19580 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
19590 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
195a0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
195b0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
195c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
195d0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
195e0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
195f0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
19600 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
19610 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
19620 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
19630 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
19640 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
19650 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
19660 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
19670 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
19680 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
19690 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
196a0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
196b0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
196c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
196d0 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
196e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
196f0 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
19700 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
19710 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
19720 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
19730 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19740 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
19750 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
19760 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
19770 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
19780 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
19790 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
197a0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
197b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
197c0 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
197d0 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
197e0 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
197f0 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
19800 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
19810 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
19820 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
19830 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
19840 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
19850 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
19860 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
19870 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
19880 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
19890 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
198a0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
198b0 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
198c0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
198d0 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
198e0 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
198f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  s..**.** This wi
19900 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
19910 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
19920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19930 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
19940 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
19950 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
19960 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
19970 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
19980 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
19990 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b  seTwo(Btree *p){
199a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
199b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
199c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
199d0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
199e0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
199f0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
19a00 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
19a10 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
19a20 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
19a30 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
19a40 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
19a50 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
19a60 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
19a70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
19a80 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19a90 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
19aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
19ab0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
19ac0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
19ad0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
19ae0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
19af0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19b00 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19b10 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
19b20 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
19b30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19b50 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
19b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19b70 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
19b80 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
19b90 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  EAD;.  }..  btre
19ba0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
19bb0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
19bc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
19bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19be0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
19bf0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
19c00 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
19c10 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
19c20 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
19c30 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
19c40 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
19c50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
19c60 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
19c70 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
19c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
19ca0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
19cb0 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
19cc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19cd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19ce0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
19cf0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19d00 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
19d10 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
19d20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
19d30 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
19d40 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
19d50 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
19d60 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
19d70 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
19d80 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
19d90 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
19da0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
19db0 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
19dc0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
19dd0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
19de0 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
19df0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
19e00 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
19e10 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
19e20 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
19e30 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
19e40 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
19e50 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
19e60 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
19e70 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
19e80 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
19e90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
19ea0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
19eb0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
19ec0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
19ed0 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
19ee0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
19ef0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
19f00 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
19f10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
19f20 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
19f30 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
19f40 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
19f50 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
19f60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
19f70 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
19f80 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
19f90 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
19fa0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
19fb0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
19fc0 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
19fd0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
19fe0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
19ff0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
1a000 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
1a010 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
1a020 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
1a030 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
1a040 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1a050 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
1a060 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
1a070 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
1a080 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1a090 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1a0a0 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
1a0b0 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
1a0c0 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
1a0d0 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
1a0e0 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
1a0f0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
1a100 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
1a110 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
1a120 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
1a130 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
1a140 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
1a150 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
1a160 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
1a170 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
1a180 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
1a190 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
1a1a0 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
1a1b0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
1a1c0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1a1d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a1e0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1a1f0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
1a200 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
1a210 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1a220 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a230 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1a240 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1a250 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1a260 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1a270 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
1a280 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1a290 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
1a2a0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
1a2b0 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
1a2c0 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
1a2d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1a2e0 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1a2f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1a300 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
1a310 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
1a320 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1a330 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1a340 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1a350 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1a360 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
1a370 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
1a380 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
1a390 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
1a3a0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
1a3b0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
1a3c0 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
1a3d0 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
1a3e0 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
1a3f0 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
1a400 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1a410 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
1a420 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1a430 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1a440 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1a450 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1a460 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1a470 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1a480 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1a490 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1a4a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a4b0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
1a4c0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1a4d0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1a4e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
1a4f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1a500 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a510 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1a520 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1a530 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  Bt, 0, 0);.#ifnd
1a540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1a550 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
1a560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a570 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
1a580 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74  s a horrible sit
1a590 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72  uation. An IO or
1a5a0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1a5b0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a  occurred whilst.
1a5c0 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
1a5d0 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
1a5e0 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
1a5f0 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
1a600 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
1a610 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
1a620 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
1a630 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1a640 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
1a650 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
1a660 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
1a670 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
1a680 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
1a690 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
1a6a0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
1a6b0 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
1a6c0 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
1a6d0 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
1a6e0 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
1a6f0 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
1a700 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
1a710 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
1a720 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
1a730 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
1a740 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1a750 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
1a760 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
1a770 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1a780 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
1a790 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a7a0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1a7b0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
1a7c0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
1a7d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1a7e0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
1a7f0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1a800 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
1a810 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1a820 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a830 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1a840 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
1a850 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
1a860 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
1a870 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
1a880 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
1a890 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
1a8a0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
1a8b0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
1a8c0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
1a8d0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
1a8e0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
1a8f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1a900 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
1a910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a920 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
1a930 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
1a940 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
1a950 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a960 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
1a970 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1a980 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
1a990 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1a9a0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1a9b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
1a9c0 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
1a9d0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1a9e0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
1a9f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1aa00 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
1aa10 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
1aa20 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
1aa30 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
1aa40 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1aa50 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
1aa60 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1aa70 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1aa80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1aa90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1aaa0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
1aab0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
1aac0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1aad0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
1aae0 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
1aaf0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
1ab00 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
1ab10 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
1ab20 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
1ab30 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
1ab40 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
1ab50 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
1ab60 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1ab70 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
1ab80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
1ab90 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
1aba0 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
1abb0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
1abc0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
1abd0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
1abe0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
1abf0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
1ac00 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
1ac10 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
1ac20 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
1ac30 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
1ac40 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
1ac50 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
1ac60 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
1ac70 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
1ac80 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
1ac90 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
1aca0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
1acb0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
1acc0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
1acd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1ace0 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
1acf0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
1ad00 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1ad10 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
1ad20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
1ad30 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
1ad40 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
1ad50 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
1ad60 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
1ad70 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
1ad80 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
1ad90 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1ada0 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
1adb0 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
1adc0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1add0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
1ade0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
1adf0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
1ae00 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
1ae10 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
1ae20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
1ae30 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
1ae40 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
1ae50 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
1ae60 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1ae70 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
1ae80 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1ae90 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
1aea0 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
1aeb0 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
1aec0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1aed0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1aee0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
1aef0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1af00 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
1af10 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1af20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72    assert( pBt->r
1af30 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
1af40 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1af50 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
1af60 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
1af70 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
1af80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1af90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1afa0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1afb0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
1afc0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
1afd0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1afe0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
1aff0 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
1b000 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
1b010 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
1b020 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
1b030 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
1b040 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
1b050 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
1b060 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
1b070 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
1b080 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
1b090 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
1b0a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1b0b0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
1b0c0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
1b0d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1b0e0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1b0f0 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
1b100 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
1b110 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1b120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b130 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1b140 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1b150 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
1b160 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
1b170 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
1b180 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1b190 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
1b1a0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
1b1b0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
1b1c0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
1b1d0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1b1e0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
1b1f0 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
1b200 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
1b210 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
1b220 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
1b230 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b240 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
1b250 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
1b260 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
1b270 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
1b280 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
1b290 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
1b2a0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
1b2b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1b2c0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1b2d0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
1b2e0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
1b2f0 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
1b300 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
1b310 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
1b320 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
1b330 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
1b340 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
1b350 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
1b360 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
1b370 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
1b380 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
1b390 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
1b3a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1b3b0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
1b3c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1b3d0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1b3e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1b3f0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1b400 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
1b410 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
1b420 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
1b430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1b440 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
1b450 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
1b460 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
1b470 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
1b480 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b490 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
1b4a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
1b4b0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1b4c0 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
1b4d0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1b4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b4f0 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
1b500 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e 69  nt<0 && pBt->ini
1b510 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20 70 42  tiallyEmpty ) pB
1b520 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1b530 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1b540 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1b550 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
1b560 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
1b570 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
1b580 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
1b590 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
1b5a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1b5b0 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
1b5c0 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
1b5d0 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
1b5e0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
1b5f0 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
1b600 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
1b610 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
1b620 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
1b630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1b640 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
1b650 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1b660 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b670 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b680 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1b690 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
1b6a0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
1b6b0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
1b6c0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
1b6d0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
1b6e0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1b6f0 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
1b700 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
1b710 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
1b720 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
1b730 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1b740 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
1b750 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
1b760 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
1b770 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1b780 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
1b790 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
1b7a0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
1b7b0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1b7c0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
1b7d0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
1b7e0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
1b7f0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1b800 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
1b810 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
1b820 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
1b830 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
1b840 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
1b850 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
1b860 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
1b870 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
1b880 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
1b890 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
1b8a0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
1b8b0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
1b8c0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
1b8d0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
1b8e0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
1b8f0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
1b900 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
1b910 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
1b920 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1b930 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
1b940 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
1b950 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
1b960 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
1b970 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
1b980 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
1b990 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
1b9a0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
1b9b0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
1b9c0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
1b9d0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
1b9e0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
1b9f0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
1ba00 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
1ba10 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
1ba20 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
1ba30 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
1ba40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1ba50 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
1ba60 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
1ba70 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
1ba80 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
1ba90 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
1baa0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
1bab0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
1bac0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
1bad0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
1bae0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
1baf0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
1bb00 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
1bb10 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
1bb20 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1bb30 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1bb40 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
1bb50 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
1bb60 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
1bb70 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1bb80 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1bb90 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
1bba0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
1bbb0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
1bbc0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
1bbd0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
1bbe0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1bbf0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
1bc00 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1bc10 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bc40 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1bc50 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1bc80 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1bc90 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1bca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bcc0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1bcd0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1bce0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1bcf0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1bd00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1bd10 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1bd20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1bd30 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1bd60 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1bd70 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1bd80 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1bd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1bda0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1bdb0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1bdc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1bdd0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1bde0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1bdf0 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1be00 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1be10 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1be20 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1be30 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1be40 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1be50 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1be60 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1be70 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1be80 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1be90 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1bea0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1beb0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1bec0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1bed0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1bee0 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1bef0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1bf00 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1bf10 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1bf20 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1bf30 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1bf40 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1bf50 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1bf60 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1bf70 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1bf80 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1bf90 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1bfa0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1bfb0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1bfc0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1bfd0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1bfe0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1bff0 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1c000 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1c010 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1c020 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1c030 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1c040 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1c050 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  && pBt->readOnly
1c060 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1c070 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1c080 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1c090 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
1c0a0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1c0b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1c0c0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a  ITE_EMPTY;.  }..
1c0d0 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1c0e0 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1c0f0 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1c100 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1c110 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1c120 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1c130 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1c140 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1c150 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1c160 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1c170 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1c180 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1c190 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1c1a0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1c1b0 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1c1c0 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1c1d0 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1c1e0 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1c1f0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1c200 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1c210 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1c220 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1c230 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1c240 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1c250 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1c260 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1c270 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1c280 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1c290 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1c2a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1c2b0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1c2c0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2f0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1c300 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c330 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1c340 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1c350 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c380 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1c390 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1c3a0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1c3b0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1c3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1c3d0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1c3e0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1c3f0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1c420 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1c430 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1c440 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c450 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1c460 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1c470 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1c480 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1c490 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c4a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c4b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c4c0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1c4d0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1c4e0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1c4f0 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1c500 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1c510 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1c520 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1c530 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1c540 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1c550 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1c560 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1c570 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1c580 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1c590 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1c5a0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1c5b0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1c5c0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1c5d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c5e0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1c5f0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1c600 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
1c610 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
1c620 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
1c630 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
1c640 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1c650 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1c660 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
1c670 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
1c680 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
1c690 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
1c6a0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
1c6b0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
1c6c0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
1c6d0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
1c6e0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
1c6f0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
1c700 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
1c710 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
1c720 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
1c730 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
1c740 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
1c750 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1c760 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
1c770 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1c780 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1c790 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
1c7a0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
1c7b0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
1c7c0 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
1c7d0 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68  .** Set the cach
1c7e0 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f  ed rowid value o
1c7f0 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69  f every cursor i
1c800 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
1c810 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70  ase file.** as p
1c820 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74  Cur and having t
1c830 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67  he same root pag
1c840 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72  e number as pCur
1c850 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a  .  The value is.
1c860 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64  ** set to iRowid
1c870 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73  ..**.** Only pos
1c880 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75  itive rowid valu
1c890 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1c8a0 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73  d valid for this
1c8b0 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63   cache..** The c
1c8c0 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69  ache is initiali
1c8d0 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64  zed to zero, ind
1c8e0 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c  icating an inval
1c8f0 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62  id cache..** A b
1c900 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66  tree will work f
1c910 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72  ine with zero or
1c920 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1c930 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f  .  We just canno
1c940 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20  t.** cache zero 
1c950 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1c960 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  ds, which means 
1c970 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20  tables that use 
1c980 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74  zero or.** negat
1c990 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74  ive rowids might
1c9a0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
1c9b0 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72  ower.  But in pr
1c9c0 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20  actice, zero.** 
1c9d0 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1c9e0 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f  ds are very unco
1c9f0 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f  mmon so this sho
1ca00 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f  uld not be a pro
1ca10 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
1ca20 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
1ca30 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1ca40 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33  r *pCur, sqlite3
1ca50 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a  _int64 iRowid){.
1ca60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1ca70 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74   for(p=pCur->pBt
1ca80 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1ca90 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1caa0 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
1cab0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
1cac0 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20   p->cachedRowid 
1cad0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20  = iRowid;.  }.  
1cae0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61  assert( pCur->ca
1caf0 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69  chedRowid==iRowi
1cb00 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  d );.}../*.** Re
1cb10 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20  turn the cached 
1cb20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69  rowid for the gi
1cb30 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e  ven cursor.  A n
1cb40 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a  egative or zero.
1cb50 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1cb60 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1cb70 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69  he rowid cache i
1cb80 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  s invalid and sh
1cb90 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72  ould be.** ignor
1cba0 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69  ed.  If the rowi
1cbb0 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65  d cache has neve
1cbc0 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65  r before been se
1cbd0 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72  t, then a.** zer
1cbe0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
1cbf0 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1cc00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43  sqlite3BtreeGetC
1cc10 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1cc20 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1cc30 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65  turn pCur->cache
1cc40 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dRowid;.}../*.**
1cc50 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
1cc60 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
1cc70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1cc80 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
1cc90 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
1cca0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
1ccb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1ccc0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
1ccd0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
1cce0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
1ccf0 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
1cd00 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
1cd10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1cd20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1cd30 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
1cd40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1cd50 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1cd60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1cd70 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1cd80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
1cd90 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
1cda0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1cdb0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1cdc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cdd0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1cde0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1cdf0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1ce00 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
1ce10 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1ce20 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
1ce30 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1ce40 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
1ce50 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1ce60 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1ce70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1ce80 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
1ce90 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1cea0 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
1ceb0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
1cec0 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
1ced0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
1cee0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
1cef0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1cf00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1cf10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cf20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1cf30 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
1cf40 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1cf50 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
1cf60 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
1cf70 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
1cf80 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
1cf90 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
1cfa0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
1cfb0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
1cfc0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1cfd0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
1cfe0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1cff0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
1d000 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
1d010 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
1d020 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1d030 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
1d040 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
1d050 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
1d060 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
1d070 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
1d080 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
1d090 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1d0a0 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
1d0b0 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
1d0c0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1d0d0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
1d0e0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
1d0f0 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
1d100 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
1d110 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
1d120 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
1d130 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
1d140 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
1d150 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
1d160 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1d170 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
1d180 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
1d190 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
1d1a0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
1d1b0 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
1d1c0 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
1d1d0 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
1d1e0 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
1d1f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
1d200 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1d210 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1d220 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
1d230 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1d240 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1d250 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
1d260 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
1d270 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
1d280 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1d290 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1d2a0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1d2b0 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1d2c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1d2d0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1d2e0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1d2f0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1d300 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1d310 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1d320 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1d330 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1d340 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1d350 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1d360 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1d370 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1d380 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1d390 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1d3a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1d3b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1d3c0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1d3d0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1d3e0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1d3f0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1d400 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1d410 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1d420 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1d430 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1d440 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1d450 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d460 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1d470 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
1d480 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
1d490 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
1d4a0 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
1d4b0 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
1d4c0 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
1d4d0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
1d4e0 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
1d4f0 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
1d500 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
1d540 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1d550 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d580 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1d590 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1d5a0 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1d5e0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1d5f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1d600 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1d610 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1d620 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d  fo); \.    pCur-
1d630 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
1d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
1d6d0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1d6e0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
1d720 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
1d730 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
1d740 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
1d750 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
1d760 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1d770 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1d780 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1d790 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
1d7a0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
1d7b0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
1d7c0 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
1d7d0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1d7e0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
1d7f0 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
1d800 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
1d810 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
1d820 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
1d830 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1d840 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1d850 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
1d860 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1d870 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
1d880 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1d890 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
1d8a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d8b0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
1d8c0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1d8d0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1d8e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1d8f0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
1d900 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
1d910 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
1d920 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1d930 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
1d940 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1d950 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
1d960 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
1d970 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
1d980 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1d990 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
1d9a0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
1d9b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1d9c0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
1d9d0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
1d9e0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
1d9f0 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
1da00 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
1da10 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
1da20 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1da30 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1da40 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
1da50 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
1da60 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
1da70 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
1da80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1da90 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
1daa0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
1dab0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1dac0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1dad0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1dae0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1daf0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1db00 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1db10 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1db20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1db30 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
1db40 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  LID ){.    *pSiz
1db50 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1db60 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1db70 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a  pCur);.    *pSiz
1db80 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1db90 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Key;.  }.  retur
1dba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1dbb0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1dbc0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1dbd0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1dbe0 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
1dbf0 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
1dc00 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
1dc10 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1dc20 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
1dc30 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1dc40 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
1dc50 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
1dc60 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
1dc70 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1dc80 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
1dc90 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
1dca0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
1dcb0 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
1dcc0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1dcd0 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
1dce0 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
1dcf0 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
1dd00 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
1dd10 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
1dd20 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
1dd30 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
1dd40 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
1dd50 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
1dd60 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
1dd70 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
1dd80 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
1dd90 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
1dda0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ddb0 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
1ddc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1ddd0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1dde0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ddf0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1de00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1de10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1de20 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
1de30 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
1de40 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1de50 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e  .nData;.  return
1de60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1de70 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
1de80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
1de90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1dea0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
1deb0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
1dec0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
1ded0 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
1dee0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1def0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1df00 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
1df10 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
1df20 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
1df30 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
1df40 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
1df50 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
1df60 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
1df70 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1df80 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
1df90 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
1dfa0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
1dfb0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1dfc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1dfd0 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
1dfe0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1dff0 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
1e000 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1e010 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
1e020 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
1e030 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
1e040 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
1e050 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
1e060 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
1e070 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
1e080 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
1e090 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
1e0a0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
1e0b0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1e0c0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
1e0d0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1e0e0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
1e0f0 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
1e100 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
1e110 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1e120 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
1e130 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
1e140 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1e150 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1e160 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
1e170 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
1e180 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
1e190 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
1e1a0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
1e1b0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
1e1c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1e1d0 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
1e1e0 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
1e1f0 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
1e200 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
1e210 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
1e220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1e230 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
1e240 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e260 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
1e270 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
1e280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e290 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
1e2a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1e2b0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
1e2c0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
1e2d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
1e2e0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
1e2f0 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
1e300 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e320 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
1e330 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1e340 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
1e350 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1e360 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
1e370 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e380 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1e390 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e3a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1e3b0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
1e3c0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
1e3d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1e3e0 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
1e3f0 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
1e400 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1e410 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
1e420 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
1e430 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
1e440 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
1e450 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1e460 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
1e470 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
1e480 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
1e490 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
1e4a0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
1e4b0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
1e4c0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
1e4d0 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
1e4e0 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
1e4f0 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
1e500 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
1e510 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
1e520 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1e530 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
1e540 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
1e550 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
1e560 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
1e570 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1e580 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
1e590 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
1e5a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e5b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
1e5c0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
1e5d0 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
1e5e0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1e5f0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1e600 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1e610 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
1e620 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
1e630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e640 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
1e650 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
1e660 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
1e670 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
1e680 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
1e690 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1e6a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e6b0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1e6c0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
1e6d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1e6e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e6f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1e700 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1e710 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
1e720 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1e730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1e740 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1e750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1e770 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1e780 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1e790 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1e7a0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1e7b0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1e7c0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1e7d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1e7e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1e7f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1e800 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1e810 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1e820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1e830 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1e840 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1e850 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1e860 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1e870 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1e880 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1e890 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1e8a0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1e8b0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1e8c0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1e8d0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1e8e0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1e8f0 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1e900 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1e910 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1e920 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1e930 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1e940 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1e950 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1e960 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1e970 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1e980 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1e990 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1e9a0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1e9b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1e9c0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1e9d0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1e9e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1e9f0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1ea00 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1ea10 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1ea20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ea30 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1ea40 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1ea50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1ea60 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1ea70 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1eaa0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
1eab0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
1eac0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
1ead0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
1eae0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
1eaf0 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
1eb00 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
1eb10 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
1eb20 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
1eb30 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
1eb40 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
1eb50 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
1eb60 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
1eb70 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1eb80 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1eb90 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
1eba0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ebb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ebc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ebd0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
1ebe0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
1ebf0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
1ec00 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1ec10 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
1ec20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
1ec30 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1ec40 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
1ec50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
1ec60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1ec70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ec80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ec90 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
1eca0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
1ecb0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
1ecc0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
1ecd0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
1ece0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1ecf0 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
1ed00 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1ed10 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
1ed20 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
1ed30 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
1ed40 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
1ed50 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
1ed60 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
1ed70 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
1ed80 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
1ed90 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
1eda0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
1edb0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
1edc0 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
1edd0 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
1ede0 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
1edf0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1ee00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
1ee10 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
1ee20 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
1ee30 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
1ee40 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
1ee50 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
1ee60 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
1ee70 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
1ee80 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
1ee90 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
1eea0 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
1eeb0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
1eec0 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
1eed0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1eee0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1eef0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1ef00 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
1ef10 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
1ef20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
1ef30 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1ef40 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
1ef50 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
1ef60 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
1ef70 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
1ef80 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
1ef90 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
1efa0 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
1efb0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
1efc0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
1efd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1efe0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1eff0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
1f000 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
1f010 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
1f020 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
1f030 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
1f040 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
1f050 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
1f060 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
1f070 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
1f080 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
1f090 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
1f0a0 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
1f0b0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
1f0c0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1f0d0 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
1f0e0 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
1f0f0 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
1f100 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
1f110 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
1f120 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
1f130 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
1f140 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
1f150 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
1f160 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
1f170 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
1f180 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1f190 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1f1a0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1f1b0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1f1c0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
1f1d0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
1f1e0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
1f1f0 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
1f200 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
1f210 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
1f220 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
1f230 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
1f240 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
1f250 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
1f260 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
1f270 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
1f280 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
1f290 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
1f2a0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
1f2b0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
1f2c0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1f2d0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
1f2e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
1f2f0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
1f300 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
1f310 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1f320 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f330 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
1f340 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
1f350 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
1f360 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1f370 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
1f380 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
1f390 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
1f3a0 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
1f3b0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
1f3c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f3d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f3e0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1f3f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f400 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1f410 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
1f420 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f430 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
1f440 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1f450 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
1f460 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
1f470 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
1f480 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
1f490 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
1f4a0 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
1f4b0 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
1f4c0 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
1f4d0 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
1f4e0 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
1f4f0 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
1f500 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
1f510 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
1f520 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
1f530 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
1f540 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
1f550 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
1f560 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
1f570 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
1f580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f590 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1f5a0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
1f5b0 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
1f5c0 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
1f5d0 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
1f5e0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
1f5f0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
1f600 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1f610 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1f620 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
1f630 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1f640 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
1f650 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f660 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
1f670 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
1f680 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1f690 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
1f6a0 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
1f6b0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
1f6c0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
1f6d0 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
1f6e0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
1f6f0 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
1f700 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
1f710 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1f720 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1f730 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
1f740 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
1f750 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1f760 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
1f770 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
1f780 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
1f790 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
1f7a0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1f7b0 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
1f7c0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
1f7d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f7e0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1f7f0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
1f800 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
1f810 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
1f820 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
1f830 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
1f840 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1f850 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
1f860 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
1f870 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
1f880 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
1f890 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
1f8a0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1f8b0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
1f8c0 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
1f8d0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
1f8e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1f8f0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
1f900 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
1f910 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
1f920 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
1f930 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
1f940 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
1f950 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
1f960 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
1f970 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
1f980 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
1f990 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
1f9a0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1f9b0 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
1f9c0 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
1f9d0 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
1f9e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
1f9f0 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
1fa00 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
1fa10 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
1fa20 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
1fa30 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
1fa40 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
1fa50 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77   /* nOvfl is alw
1fa60 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49  ays positive.  I
1fa70 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20  f it were zero, 
1fa80 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75  fetchPayload wou
1fa90 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ld have.      **
1faa0 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65   been used inste
1fab0 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ad of this routi
1fac0 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ne. */.      if(
1fad0 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26   ALWAYS(nOvfl) &
1fae0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1faf0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
1fb00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1fb10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1fb20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
1fb30 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1fb40 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
1fb50 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
1fb60 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
1fb70 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
1fb80 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
1fb90 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
1fba0 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
1fbb0 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
1fbc0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
1fbd0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1fbe0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
1fbf0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
1fc00 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
1fc10 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
1fc20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1fc30 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1fc40 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
1fc50 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
1fc60 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
1fc70 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
1fc80 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
1fc90 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
1fca0 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
1fcb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fcc0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1fcd0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
1fce0 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
1fcf0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1fd00 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
1fd10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1fd20 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1fd30 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
1fd40 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1fd50 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
1fd60 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
1fd70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
1fd80 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1fd90 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
1fda0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1fdb0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
1fdc0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
1fdd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
1fde0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
1fdf0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
1fe00 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
1fe10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1fe20 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
1fe30 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1fe40 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
1fe50 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1fe60 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
1fe70 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
1fe80 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
1fe90 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
1fea0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
1feb0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
1fec0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
1fed0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
1fee0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
1fef0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
1ff00 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1ff10 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1ff20 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
1ff30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1ff40 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1ff50 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
1ff60 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1ff70 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1ff80 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
1ff90 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
1ffa0 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
1ffb0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1ffc0 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
1ffd0 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
1ffe0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
1fff0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
20000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20010 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
20020 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
20030 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
20040 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
20050 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
20060 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
20070 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
20080 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
20090 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
200a0 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
200b0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
200c0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
200d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
200e0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
200f0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
20100 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
20110 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
20120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20130 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
20140 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
20150 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
20160 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
20170 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
20180 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
20190 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
201a0 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
201b0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
201c0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
201d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
201e0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
201f0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
20200 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
20210 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
20220 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
20230 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
20240 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
20250 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
20260 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d  .          amt -
20270 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = a;.          p
20280 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
20290 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
202a0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
202b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
202c0 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
202d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
202e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
202f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20300 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
20310 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
20320 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
20330 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
20340 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
20350 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
20360 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
20370 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
20380 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
20390 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
203a0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
203b0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
203c0 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
203d0 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
203e0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
203f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
20400 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
20410 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
20420 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
20430 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
20440 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
20450 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
20460 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
20470 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
20480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20490 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
204a0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
204b0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
204c0 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
204d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
204e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
204f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
20500 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20510 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
20520 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
20530 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20540 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
20550 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
20560 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20570 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
20580 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
20590 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
205a0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
205b0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
205c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
205d0 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
205e0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
205f0 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
20600 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
20610 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
20620 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
20630 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
20640 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
20650 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
20660 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
20670 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20680 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
20690 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
206a0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
206b0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
206c0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
206d0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
206e0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
206f0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
20700 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
20710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20720 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
20730 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
20740 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
20750 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
20760 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
20770 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
20780 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
20790 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
207a0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
207b0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
207c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
207d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
207e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
207f0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
20800 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
20810 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
20820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20840 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20850 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
20860 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
20870 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
20880 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
20890 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
208a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
208b0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
208c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
208d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
208e0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
208f0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
20900 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
20910 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20920 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
20930 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
20940 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
20950 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
20960 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
20970 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
20980 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
20990 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
209a0 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
209b0 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
209c0 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
209d0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
209e0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
209f0 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
20a00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
20a10 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
20a20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
20a30 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
20a40 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
20a50 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
20a60 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
20a70 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
20a80 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
20a90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
20aa0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
20ab0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
20ac0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
20ad0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
20ae0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
20af0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
20b00 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
20b10 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
20b20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
20b30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
20b40 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
20b50 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
20b60 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
20b70 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
20b80 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
20b90 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
20ba0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
20bb0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
20bc0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
20bd0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
20be0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
20bf0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
20c00 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
20c10 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
20c20 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
20c30 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
20c40 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
20c50 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
20c60 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
20c70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20c80 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
20c90 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
20ca0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
20cb0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
20cc0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
20cd0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
20ce0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
20cf0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
20d00 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
20d10 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
20d20 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
20d30 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
20d40 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
20d50 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
20d60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
20d70 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
20d80 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
20d90 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
20da0 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
20db0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
20dc0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
20dd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
20de0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
20df0 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
20e00 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
20e10 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
20e20 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
20e30 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
20e40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20e50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
20e60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20e70 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20e80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
20e90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
20ea0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
20eb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20ec0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
20ed0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
20ee0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
20ef0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
20f00 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66   NEVER(pCur->inf
20f10 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20  o.nSize==0) ){. 
20f20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
20f30 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
20f40 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75  Cur->iPage], pCu
20f50 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20f60 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
20f70 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72 2d            &pCur-
20f80 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50  >info);.  }.  aP
20f90 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
20fa0 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
20fb0 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
20fc0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
20fd0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
20fe0 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
20ff0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
21000 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  Key = (int)pCur-
21010 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
21020 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
21030 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
21040 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
21050 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
21060 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
21070 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
21080 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
21090 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72  Local;.    asser
210a0 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20  t( nLocal<=nKey 
210b0 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
210c0 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
210d0 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
210e0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
210f0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
21100 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
21110 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
21120 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
21130 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
21140 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
21150 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
21160 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
21170 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
21180 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
21190 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
211a0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
211b0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
211c0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
211d0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
211e0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
211f0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
21200 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
21210 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
21220 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
21230 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
21240 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
21250 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
21260 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
21270 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
21280 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
21290 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
212a0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
212b0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
212c0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
212d0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
212e0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
212f0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
21300 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
21310 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
21320 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
21330 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
21340 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
21350 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
21360 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
21370 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
21380 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21390 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
213a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
213b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
213c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
213d0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
213e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
213f0 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
21400 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
21410 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
21420 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
21430 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
21440 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
21450 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
21460 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
21470 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
21480 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
21490 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
214a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
214b0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
214c0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
214d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
214e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
214f0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
21500 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21510 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
21520 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
21530 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
21540 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
21550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
21560 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
21570 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
21580 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
21590 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
215a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
215b0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
215c0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
215d0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
215e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
215f0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
21600 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
21610 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
21620 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
21630 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
21640 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
21650 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
21660 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
21670 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
21680 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
21690 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
216a0 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
216b0 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
216c0 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
216d0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
216e0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
216f0 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
21700 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
21710 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
21720 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
21730 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
21740 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
21750 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
21760 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21770 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21780 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
21790 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
217a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
217b0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
217c0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
217d0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
217e0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
217f0 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
21800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21810 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
21820 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
21830 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
21840 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
21850 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21860 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
21870 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
21880 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
21890 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
218a0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
218b0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
218c0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
218d0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
218e0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
218f0 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
21900 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
21910 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
21920 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
21930 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21940 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
21950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21960 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
21970 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
21980 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
21990 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
219a0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
219b0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
219c0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
219d0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
219e0 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
219f0 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
21a00 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
21a10 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
21a20 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
21a30 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
21a40 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
21a50 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
21a60 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
21a70 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
21a80 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
21a90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21aa0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
21ab0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
21ac0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
21ad0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
21ae0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
21af0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
21b00 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
21b10 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
21b20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
21b30 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
21b40 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
21b50 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
21b60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21b70 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
21b80 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
21b90 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
21ba0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
21bb0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
21bc0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
21bd0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
21be0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
21bf0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
21c00 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
21c10 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
21c20 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
21c30 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
21c40 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
21c50 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
21c60 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
21c70 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
21c80 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
21c90 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
21ca0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
21cb0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
21cc0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
21cd0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
21ce0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
21cf0 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
21d00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
21d10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
21d20 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21d30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21d40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21d50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
21d60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
21d70 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
21d80 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21d90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
21da0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
21db0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
21dc0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21dd0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
21de0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21df0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
21e00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21e10 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
21e20 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
21e30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21e40 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
21e50 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
21e60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
21e70 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
21e80 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
21e90 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
21ea0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
21eb0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
21ec0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
21ed0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
21ee0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
21ef0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
21f00 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
21f10 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
21f20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
21f30 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
21f40 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
21f50 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
21f60 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
21f70 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
21f80 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
21f90 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
21fa0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
21fb0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
21fc0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
21fd0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
21fe0 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
21ff0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
22000 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
22010 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
22020 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
22030 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
22040 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
22050 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
22060 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
22070 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
22080 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
22090 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
220a0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
220b0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
220c0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
220d0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
220e0 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
220f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
22100 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
22110 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
22120 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
22130 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
22140 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
22150 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
22160 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
22170 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
22180 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
22190 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
221a0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
221b0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
221c0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
221d0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
221e0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
221f0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
22200 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
22210 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
22220 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
22230 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
22240 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
22250 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
22260 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
22270 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
22280 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
22290 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
222a0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
222b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
222c0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
222d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
222e0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
222f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22300 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
22310 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
22320 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22330 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
22340 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22350 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22360 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
22370 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
22380 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
22390 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
223a0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
223b0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
223c0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
223d0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
223e0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
223f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
22400 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
22410 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
22420 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22430 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
22440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
22450 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
22460 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
22470 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
22480 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
22490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
224a0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
224b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
224c0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
224d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
224e0 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=1; i<=pCur->i
224f0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
22500 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
22510 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
22520 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
22530 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  iPage = 0;.  }el
22540 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
22550 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
22560 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
22570 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
22580 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
22590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
225a0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
225b0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
225c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
225d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
225e0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20  r->iPage = 0;.. 
225f0 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70     /* If pCur->p
22600 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
22610 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
22620 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
22630 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20   this cursor.   
22640 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
22650 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
22660 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
22670 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
22680 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  fo is.    ** NUL
22690 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
226a0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
226b0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
226c0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
226d0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
226e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
226f0 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rror.  */.    as
22700 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22710 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31  ge[0]->intKey==1
22720 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
22730 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  [0]->intKey==0 )
22740 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  ;.    if( (pCur-
22750 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
22760 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22770 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
22780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22790 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
227a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65  }.  }..  /* Asse
227b0 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74  rt that the root
227c0 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20   page is of the 
227d0 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68  correct type. Th
227e0 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20  is must be the. 
227f0 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20   ** case as the 
22800 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
22810 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65  ction that loade
22820 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  d the root-page 
22830 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69  (either.  ** thi
22840 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76  s call or a prev
22850 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29  ious invocation)
22860 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
22870 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20  cted corruption 
22880 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73  .  ** if the ass
22890 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  umption were not
228a0 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73   true, and it is
228b0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
228c0 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a  r the flags .  *
228d0 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62  * byte to have b
228e0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69  een modified whi
228f0 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  le this cursor i
22900 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
22910 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68  rence.  ** to th
22920 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52  e page.  */.  pR
22930 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
22940 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
22950 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
22960 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
22970 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
22980 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72  >isInit && (pCur
22990 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d  ->pKeyInfo==0)==
229a0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b  pRoot->intKey );
229b0 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
229c0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
229d0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
229e0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
229f0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
22a00 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
22a10 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
22a20 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
22a30 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
22a40 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
22a50 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
22a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22a70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22a80 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
22a90 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
22aa0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
22ab0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
22ac0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
22ad0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
22ae0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
22af0 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
22b00 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
22b10 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
22b20 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
22b30 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
22b40 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
22b50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22b60 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22b70 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
22b80 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
22b90 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
22ba0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
22bb0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
22bc0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
22bd0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
22be0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
22bf0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
22c00 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
22c10 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
22c20 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
22c30 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
22c40 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
22c50 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
22c60 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
22c70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
22c80 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
22c90 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22ca0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22cb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22cc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22cd0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
22ce0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22cf0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
22d00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22d10 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
22d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
22d30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22d40 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
22d50 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
22d60 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
22d70 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
22d80 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22d90 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
22da0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
22db0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
22dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22dd0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22de0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
22df0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
22e00 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
22e10 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
22e20 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
22e30 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
22e40 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
22e50 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
22e60 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
22e70 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
22e80 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
22e90 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
22ea0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
22eb0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
22ec0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
22ed0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
22ee0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
22ef0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
22f00 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
22f10 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
22f20 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
22f30 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
22f40 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
22f50 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
22f60 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
22f70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
22f80 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
22f90 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
22fa0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
22fb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22fc0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
22fd0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
22fe0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22ff0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23010 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23020 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
23030 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
23040 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
23050 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23060 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
23070 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
23080 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
23090 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
230a0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
230b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
230c0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
230d0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
230e0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
230f0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
23100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23110 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
23120 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23130 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
23140 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
23150 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
23160 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23170 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
23180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
23190 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
231a0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
231b0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
231c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
231d0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
231e0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
231f0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
23200 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
23210 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
23220 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
23230 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
23240 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
23250 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
23260 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
23270 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
23280 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
23290 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
232a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
232b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
232c0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
232d0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
232e0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
232f0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
23300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23310 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
23320 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23330 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
23340 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
23350 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23360 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
23370 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23380 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23390 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
233a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
233b0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
233c0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
233d0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
233e0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
233f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23400 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
23410 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
23420 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
23430 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
23440 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23450 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
23460 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
23470 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
23480 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
23490 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
234a0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
234b0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
234c0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
234d0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
234e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
234f0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
23500 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
23510 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23520 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23530 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23540 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
23550 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
23560 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
23570 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
23580 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
23590 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
235a0 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
235b0 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
235c0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
235d0 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
235e0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
235f0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
23600 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
23610 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
23620 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
23630 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
23640 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
23650 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
23660 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
23670 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
23680 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
23690 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
236a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
236b0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
236c0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
236d0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
236e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
236f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
23700 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23710 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
23720 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
23730 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23740 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
23750 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
23760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23770 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
23780 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
23790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
237a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
237b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
237c0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
237d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
237e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
237f0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
23800 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
23810 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
23820 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
23830 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23840 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
23850 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23860 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
23870 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
23880 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
23890 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
238a0 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
238b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
238c0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
238d0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
238e0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
238f0 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
23900 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
23910 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
23920 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
23930 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
23940 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
23950 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
23960 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
23970 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
23980 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
23990 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
239a0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
239b0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
239c0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
239d0 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
239e0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
239f0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
23a00 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
23a10 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
23a20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
23a30 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
23a40 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
23a50 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
23a60 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
23a70 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
23a80 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
23a90 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
23aa0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
23ab0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
23ac0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
23ad0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
23ae0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
23af0 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
23b00 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
23b10 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
23b20 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
23b30 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
23b40 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
23b50 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
23b60 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
23b70 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
23b80 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
23b90 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
23ba0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
23bb0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
23bc0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
23bd0 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
23be0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
23bf0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
23c00 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23c10 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
23c20 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
23c30 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
23c40 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
23c50 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
23c60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
23c70 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
23c80 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ca0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
23cb0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
23cc0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
23cd0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
23ce0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
23cf0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
23d00 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
23d10 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
23d20 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
23d30 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
23d40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
23d50 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
23d60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
23d70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
23d80 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
23d90 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
23da0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
23db0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
23dc0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
23dd0 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
23de0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
23df0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
23e00 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
23e10 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
23e20 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
23e30 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
23e40 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e60 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
23e70 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
23e80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
23e90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23ea0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23eb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23ec0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
23ed0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
23ee0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
23ef0 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
23f00 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
23f10 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
23f20 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
23f30 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
23f40 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
23f50 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
23f60 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
23f70 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
23f80 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
23f90 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
23fa0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
23fb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23fc0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
23fd0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
23fe0 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
23ff0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
24000 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
24010 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
24020 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
24030 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
24040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
24060 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
24070 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
24080 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
24090 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
240a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
240b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
240c0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
240d0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
240e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
240f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
24100 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24110 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
24120 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24130 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24140 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
24150 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
24160 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
24170 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Cell>0 || pCur->
24180 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
24190 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  NVALID );.  if( 
241a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
241b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
241c0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
241d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
241e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
241f0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
24200 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
24210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
24220 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
24230 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
24240 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
24250 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
24260 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
24270 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
24280 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
24290 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
242a0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
242b0 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50  nt c;..    /* pP
242c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
242d0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
242e0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
242f0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
24300 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
24310 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
24320 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
24330 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
24340 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
24350 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
24360 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
24370 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
24380 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
24390 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
243a0 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
243b0 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
243c0 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
243d0 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
243e0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
243f0 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
24400 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
24410 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
24420 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
24430 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
24440 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
24450 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
24460 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
24470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24480 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
24490 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
244a0 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
244b0 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
244c0 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
244d0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
244e0 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
244f0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  ){.      pCur->a
24500 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24510 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20  ] = (u16)upr;.  
24520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
24530 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24540 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
24550 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
24560 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
24570 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
24580 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24590 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e  r->iPage]; /* In
245a0 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
245b0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
245c0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
245f0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
24600 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
24610 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ..      pCur->in
24620 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
24630 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
24640 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
24650 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
24660 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
24670 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
24680 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
24690 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
246a0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
246b0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
246c0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
246d0 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
246e0 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
246f0 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
24700 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
24710 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
24720 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
24730 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
24740 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
24750 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
24760 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
24770 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
24780 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
24790 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
247a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
247b0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
247c0 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
247d0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
247e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
247f0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24800 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
24810 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
24820 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
24830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
24840 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
24850 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
24860 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
24870 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
24880 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
24890 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
248a0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
248b0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
248c0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
248d0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
248e0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
248f0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
24900 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
24910 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
24920 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
24930 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
24940 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
24950 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
24960 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
24970 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
24980 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
24990 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
249a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
249b0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
249c0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
249d0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
249e0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
249f0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
24a00 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
24a10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24a20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
24a30 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
24a40 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30  ( !(nCell & 0x80
24a50 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67  ) && nCell<=pPag
24a60 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
24a70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
24a80 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
24a90 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
24aa0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
24ab0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
24ac0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
24ad0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
24ae0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
24af0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
24b00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
24b10 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
24b20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
24b30 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
24b40 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
24b50 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
24b60 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
24b70 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
24b80 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
24b90 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
24ba0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
24bb0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
24bc0 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
24bd0 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
24be0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
24bf0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
24c00 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
24c10 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
24c20 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
24c30 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
24c40 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
24c50 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
24c60 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
24c70 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24c80 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
24c90 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
24ca0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
24cb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
24cc0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
24cd0 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
24ce0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
24cf0 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
24d00 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
24d10 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
24d20 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
24d30 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
24d40 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
24d50 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
24d60 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
24d70 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
24d80 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
24d90 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
24da0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
24db0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
24dc0 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
24dd0 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
24de0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
24df0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
24e00 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
24e10 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
24e20 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
24e30 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
24e40 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
24e50 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
24e60 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
24e70 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
24e80 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
24e90 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
24ea0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
24eb0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
24ec0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
24ed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24ee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
24ef0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
24f00 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
24f10 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
24f20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24f30 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
24f40 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
24f50 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
24f60 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
24f70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24f80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
24f90 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
24fa0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
24fb0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
24fc0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
24fd0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
24fe0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
24ff0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
25000 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
25010 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
25020 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
25030 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
25040 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25050 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
25060 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
25070 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
25080 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
25090 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
250a0 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
250b0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
250c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
250d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
250e0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
250f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25100 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
25110 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25130 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
25140 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
25150 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
25160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
25170 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
25180 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
25190 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
251a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
251b0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
251c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
251d0 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
251e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
251f0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
25200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25210 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
25220 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
25230 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
25240 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
25250 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
25260 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
25270 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
25280 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
25290 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
252a0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
252b0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
252c0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
252d0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
252e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
252f0 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
25300 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25310 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25320 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
25330 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25340 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70  Cell );.      *p
25350 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
25360 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25370 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
25380 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
25390 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
253a0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
253b0 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
253c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
253d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
253e0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
253f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25400 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
25410 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
25420 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25430 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
25440 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
25450 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
25460 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
25470 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
25480 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
25490 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
254a0 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
254b0 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
254c0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
254d0 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
254e0 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
254f0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
25500 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
25510 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
25520 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
25530 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
25540 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
25550 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
25560 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
25570 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
25580 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25590 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
255a0 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
255b0 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
255c0 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
255d0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
255e0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
255f0 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
25600 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
25610 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
25620 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
25630 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
25640 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
25650 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
25660 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
25670 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
25680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
25690 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
256a0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
256b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
256c0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
256d0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
256e0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
256f0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
25700 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
25710 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
25720 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
25730 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
25740 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
25750 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
25760 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
25770 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
25780 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
25790 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
257a0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
257b0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
257c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
257d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
257e0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
257f0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
25800 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
25810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25830 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
25840 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
25850 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
25860 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
25870 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
25880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25890 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
258a0 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
258b0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
258c0 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
258d0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
258e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
258f0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
25900 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
25910 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25920 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
25930 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
25940 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
25950 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25960 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
25970 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d  ert( idx<=pPage-
25980 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
25990 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
259a0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
259b0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
259c0 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
259d0 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
259e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
259f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
25a00 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
25a10 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
25a20 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
25a30 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
25a40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
25a50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
25a60 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
25a70 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25a80 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
25a90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
25aa0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
25ab0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
25ac0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
25ad0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
25ae0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
25af0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
25b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25b10 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
25b20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
25b30 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
25b40 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
25b50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
25b60 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
25b70 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25b80 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
25b90 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
25ba0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
25bb0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
25bc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
25bd0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
25be0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
25bf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25c00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
25c10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
25c20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
25c30 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
25c40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25c50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
25c60 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
25c70 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
25c80 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
25c90 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
25ca0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
25cb0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
25cc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25cd0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
25ce0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
25cf0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
25d00 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
25d10 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
25d20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
25d30 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
25d40 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
25d50 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
25d60 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
25d70 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
25d80 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
25d90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
25da0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
25db0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
25dc0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
25dd0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25de0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25df0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
25e00 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
25e10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
25e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
25e30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
25e40 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
25e50 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
25e60 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
25e70 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
25e80 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
25e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
25ea0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
25eb0 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  ext<0 ){.    pCu
25ec0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
25ed0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
25ee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25ef0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
25f00 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
25f10 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
25f20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25f30 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
25f40 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
25f50 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
25f60 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
25f70 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
25f80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
25f90 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
25fa0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
25fb0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
25fc0 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
25fd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
25fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25ff0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
26000 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
26010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
26020 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
26030 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
26040 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
26050 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
26060 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
26070 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
26080 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
26090 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
260a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
260b0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
260c0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
260d0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
260e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
260f0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
26100 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
26110 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
26120 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
26130 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
26140 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26150 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
26160 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
26170 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
26180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26190 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
261a0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
261b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
261c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
261d0 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
261e0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
261f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
26200 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
26210 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
26220 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
26230 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
26240 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
26250 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
26260 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26270 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
26280 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
26290 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
262a0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
262b0 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
262c0 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
262d0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
262e0 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
262f0 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
26300 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
26310 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
26320 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
26330 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
26340 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26350 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
26360 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
26370 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
26380 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
26390 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
263a0 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
263b0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
263c0 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
263d0 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
263e0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
263f0 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
26400 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
26410 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
26420 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
26430 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
26440 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
26450 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
26460 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
26470 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
26480 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
26490 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
264a0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
264b0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
264c0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
264d0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
264e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
264f0 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
26500 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
26510 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
26520 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
26530 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
26540 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
26550 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
26560 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
26570 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
26580 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
26590 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
265a0 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
265b0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
265c0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
265d0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
265e0 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
265f0 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
26600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26610 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
26620 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
26630 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
26640 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
26650 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
26660 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
26670 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
26680 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
26690 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
266a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
266b0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
266c0 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
266d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
266e0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
266f0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
26700 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
26710 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
26720 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
26730 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
26740 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
26750 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
26760 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26770 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
26780 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26790 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
267a0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
267b0 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
267c0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
267d0 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
267e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
267f0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
26800 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
26810 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
26820 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
26830 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
26840 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
26850 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
26860 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
26870 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
26880 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
26890 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
268a0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
268b0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
268c0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
268d0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
268e0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
268f0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
26900 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
26910 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
26920 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
26930 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
26940 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
26950 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
26960 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
26970 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
26980 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
26990 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
269a0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
269b0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
269c0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
269d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
269e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
269f0 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26      if( exact &&
26a00 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
26a10 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
26a20 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
26a30 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
26a40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
26a50 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
26a60 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
26a70 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
26a80 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
26a90 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
26aa0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
26ab0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
26ac0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
26ad0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
26ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26af0 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
26b00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
26b10 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
26b20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
26b30 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
26b40 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
26b50 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
26b60 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
26b70 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
26b80 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
26b90 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
26ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26bb0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
26bc0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
26bd0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
26be0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
26bf0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
26c00 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
26c10 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
26c20 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
26c30 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
26c40 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
26c50 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
26c60 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
26c70 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
26c80 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
26c90 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
26ca0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
26cb0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
26cc0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
26cd0 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
26ce0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
26cf0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
26d00 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
26d10 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
26d20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
26d30 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
26d40 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
26d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26d60 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
26d70 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
26d80 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
26d90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
26da0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
26db0 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
26dc0 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  k>mxPage ){.    
26dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26de0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26e00 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26e10 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
26e20 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
26e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26e40 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
26e50 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
26e60 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26e70 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26e80 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
26e90 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
26ea0 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
26eb0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
26ec0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
26ed0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
26ee0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
26ef0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
26f00 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
26f10 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
26f20 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
26f30 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
26f40 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
26f50 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
26f60 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
26f70 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
26f80 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
26f90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
26fa0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26fb0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
26fc0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26fd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26fe0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26ff0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
27010 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
27020 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
27030 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
27040 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
27050 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
27060 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
27070 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
27080 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
27090 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
270a0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
270b0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
270c0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
270d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
270e0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
270f0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
27100 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
27110 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
27120 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
27130 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
27140 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
27150 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27160 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
27170 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
27180 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
27190 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
271a0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
271b0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
271c0 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
271d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
271e0 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
271f0 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
27200 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
27210 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
27220 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
27230 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
27240 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
27250 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
27260 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
27270 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
27280 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
27290 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
272a0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
272b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
272c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
272d0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
272e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
272f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
27300 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
27310 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
27320 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
27330 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
27340 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
27350 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
27360 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
27370 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
27380 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
27390 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
273a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
273b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
273c0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
273d0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
273e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
273f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
27410 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
27420 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
27430 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
27440 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
27450 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
27460 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
27470 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
27480 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27490 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
274a0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
274b0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
274c0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
274d0 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
274e0 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
274f0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
27500 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
27510 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
27520 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
27530 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
27540 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
27550 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
27560 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
27570 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
27580 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
27590 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
275a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
275b0 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
275c0 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
275d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
275e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
275f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27600 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27610 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27630 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
27640 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
27650 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
27660 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
27670 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
27680 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
27690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
276a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
276b0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
276c0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
276d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
276e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
276f0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
27700 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
27710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27720 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
27730 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
27740 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
27750 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
27760 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
27770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27780 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
27790 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
277a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
277b0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
277c0 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
277d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
277e0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
277f0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
27800 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
27810 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
27820 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
27830 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
27840 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
27850 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
27860 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
27870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
27880 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
27890 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
278a0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
278b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
278c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
278d0 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
278e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
278f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27900 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27910 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
27920 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27930 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
27950 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
27960 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
27970 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
27980 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
27990 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
279a0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
279b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
279c0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
279d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
279e0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
279f0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
27a00 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
27a10 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
27a20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
27a30 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
27a40 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
27a50 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
27a60 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
27a70 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
27a80 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
27a90 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
27aa0 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
27ab0 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
27ac0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27ad0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27ae0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
27af0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
27b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
27b10 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
27b20 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
27b30 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
27b40 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
27b50 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
27b60 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
27b70 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
27b80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
27b90 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
27ba0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
27bb0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
27bc0 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
27bd0 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
27be0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
27bf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
27c00 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
27c10 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
27c20 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
27c30 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
27c40 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
27c50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
27c60 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
27c70 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
27c80 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
27c90 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
27ca0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27cd0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
27ce0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
27cf0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
27d00 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
27d10 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
27d20 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
27d30 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
27d40 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
27d50 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
27d60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
27d70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
27d80 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
27d90 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27da0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
27db0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
27dc0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
27dd0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
27de0 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
27df0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
27e00 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
27e10 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
27e20 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
27e30 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
27e40 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
27e50 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
27e60 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
27e70 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
27e80 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
27e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27ea0 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
27eb0 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
27ec0 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
27ed0 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
27ee0 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
27ef0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
27f00 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
27f10 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
27f20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
27f30 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
27f40 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
27f50 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -1);.          a
27f60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
27f70 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
27f80 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20  Trunk->pDbPage) 
27f90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
27fa0 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
27fb0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
27fc0 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20  , *pPgno);.     
27fd0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
27fe0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
27ff0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
28000 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
28010 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28020 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28030 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28040 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
28050 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
28060 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
28070 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
28090 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
280a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
280b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
280c0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
280d0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
280e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
280f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
28100 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
28110 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
28120 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
28130 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
28140 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
28150 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
28160 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
28170 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
28180 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
28190 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
281a0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
281b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
281c0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
281d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
281e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
281f0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
28200 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
28210 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
28220 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
28230 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
28240 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28250 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
28260 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
28270 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
28280 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
28290 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
282a0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
282b0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
282c0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
282d0 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
282e0 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
282f0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
28300 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
28310 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
28320 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
28330 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
28340 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
28350 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
28360 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
28370 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
28380 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
28390 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
283a0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
283b0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
283c0 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
283d0 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
283e0 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
283f0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
28400 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
28410 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
28420 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
28430 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
28440 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
28450 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28460 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
28470 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28480 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
28490 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
284a0 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
284b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
284c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
284d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
284e0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
284f0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
28500 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28510 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
28520 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
28530 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
28540 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
28550 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
28560 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
28570 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
28580 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
28590 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
285a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
285b0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
285c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
285d0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  gno, ppPage, 1);
285e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
285f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
28600 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28610 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
28620 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
28630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28640 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
28650 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
28660 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
28670 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
28680 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
28690 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
286a0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
286b0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
286c0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
286d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
286e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
286f0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
28700 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
28710 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
28720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
28730 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
28740 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
28750 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
28760 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
28770 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
28780 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28790 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
287a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
287b0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
287c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
287d0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
287e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
287f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
28800 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
28810 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
28820 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
28830 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
28840 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
28850 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
28860 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
28870 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
28880 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
28890 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
288a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
288b0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
288c0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
288d0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
288e0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
288f0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
28900 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
28910 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
28920 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
28930 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
28940 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
28950 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
28960 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
28970 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
28980 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
28990 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
289a0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
289b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
289c0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
289d0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
289e0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
289f0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
28a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
28a10 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
28a20 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
28a30 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
28a40 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
28a50 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a70 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
28a80 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
28a90 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28ab0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
28ac0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
28ad0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
28ae0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
28af0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
28b00 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
28b10 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
28b20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28b40 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
28b50 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
28b60 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
28b70 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
28ba0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
28bd0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
28be0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
28bf0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
28c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
28c10 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
28c20 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
28c30 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
28c40 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
28c50 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
28c60 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
28c70 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
28c80 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
28c90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
28ca0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
28cb0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
28cc0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
28cd0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
28ce0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
28cf0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
28d00 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
28d10 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
28d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28d30 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
28d40 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
28d50 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
28d60 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
28d70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
28d80 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
28d90 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
28da0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
28db0 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
28dc0 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
28dd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
28de0 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
28df0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
28e00 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
28e10 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
28e20 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
28e30 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
28e40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
28e50 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
28e60 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
28e70 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
28e80 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
28e90 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
28ea0 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
28eb0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28ec0 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
28ed0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
28ee0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
28ef0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
28f00 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
28f10 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
28f20 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
28f30 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
28f40 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
28f50 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
28f60 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
28f70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
28f80 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
28f90 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
28fa0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
28fb0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
28fc0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
28fd0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
28fe0 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
28ff0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
29000 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
29020 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
29030 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
29040 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
29050 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
29060 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
29070 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
29080 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
29090 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
290a0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
290b0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
290c0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
290d0 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
290e0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
290f0 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
29100 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
29110 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
29120 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
29130 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
29140 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
29150 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
29160 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
29170 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
29180 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
29190 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
291a0 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
291b0 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
291c0 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
291d0 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
291f0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
29200 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
29210 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
29220 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
29230 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
29240 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
29250 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
29260 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
29270 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
29280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29290 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
292a0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
292b0 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
292c0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
292d0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
292e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
292f0 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
29300 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
29310 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
29320 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
29330 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29340 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29350 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
29360 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
29370 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
29380 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
29390 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
293a0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
293b0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
293c0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
293d0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
293e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
293f0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
29400 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
29410 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
29420 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
29430 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
29440 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
29450 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
29460 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
29470 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
29480 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
29490 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
294a0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
294b0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
294c0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
294d0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
294e0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
294f0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
29500 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
29510 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
29520 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
29530 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
29540 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
29550 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
29560 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
29570 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
29580 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
29590 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
295a0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
295b0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
295c0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
295d0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
295e0 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
295f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
29600 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
29610 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
29620 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
29630 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
29640 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
29650 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
29660 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
29670 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
29680 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
29690 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
296a0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
296b0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
296c0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
296d0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
296e0 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
296f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
29700 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29710 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
29720 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
29730 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29740 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
29750 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
29760 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
29770 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
29780 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
29790 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
297a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
297b0 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e 73 65  Page && !pBt->se
297c0 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
297d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
297e0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
297f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
29800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29810 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
29820 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
29830 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
29840 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
29850 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
29860 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
29870 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
29880 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
29890 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
298a0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
298b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
298c0 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
298d0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
298e0 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
298f0 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
29900 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
29910 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
29920 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
29930 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
29940 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
29950 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
29960 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
29970 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
29980 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
29990 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
299a0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
299b0 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
299c0 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
299d0 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
299e0 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
299f0 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
29a00 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
29a10 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
29a20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
29a30 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
29a40 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
29a50 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
29a60 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
29a70 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29a80 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
29a90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29aa0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
29ab0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29ac0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
29ad0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
29ae0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
29af0 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
29b00 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
29b10 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
29b20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
29b30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
29b40 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
29b50 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
29b60 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
29b70 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
29b80 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
29b90 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
29ba0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
29bb0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
29bc0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
29bd0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
29be0 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
29bf0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
29c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
29c10 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
29c20 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
29c30 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
29c40 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
29c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
29c60 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
29c70 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
29c80 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
29c90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
29ca0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
29cb0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
29cc0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
29cd0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
29ce0 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
29cf0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
29d00 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
29d10 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
29d20 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
29d30 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
29d40 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
29d50 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
29d60 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
29d70 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
29d80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29d90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
29da0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
29db0 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
29dc0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
29dd0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
29de0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
29df0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
29e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
29e10 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
29e20 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
29e30 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
29e40 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
29e50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
29e60 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
29e70 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
29e80 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
29e90 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
29ea0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
29eb0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
29ec0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
29ed0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
29ee0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
29ef0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
29f00 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
29f10 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
29f20 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
29f30 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
29f40 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
29f50 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
29f60 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
29f70 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
29f80 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
29f90 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
29fa0 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
29fb0 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
29fc0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
29fd0 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
29fe0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
29ff0 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
2a000 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
2a010 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
2a020 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
2a030 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
2a040 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2a050 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
2a060 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2a070 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2a080 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
2a090 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
2a0a0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
2a0b0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
2a0c0 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
2a0d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a0e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
2a0f0 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
2a100 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
2a110 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
2a120 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
2a130 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
2a140 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2a150 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2a160 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
2a170 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2a180 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
2a190 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
2a1a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2a1b0 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
2a1c0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2a1d0 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
2a1e0 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
2a1f0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
2a200 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
2a210 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
2a220 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
2a230 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2a240 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
2a250 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
2a260 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
2a270 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
2a280 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
2a290 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
2a2a0 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
2a2b0 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
2a2c0 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
2a2d0 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
2a2e0 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
2a2f0 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
2a300 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
2a310 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
2a320 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
2a330 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
2a340 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
2a350 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
2a360 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
2a370 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
2a380 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
2a390 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
2a3a0 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
2a3b0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
2a3c0 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
2a3d0 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
2a3e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2a3f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a400 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
2a410 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
2a420 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
2a430 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
2a440 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
2a450 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
2a460 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
2a470 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
2a480 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
2a490 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a4a0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
2a4b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2a4c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2a4d0 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
2a4e0 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
2a4f0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
2a500 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
2a510 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
2a520 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
2a530 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
2a540 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
2a550 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
2a560 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
2a570 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
2a580 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
2a590 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
2a5a0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
2a5b0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
2a5c0 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
2a5d0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
2a5e0 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
2a5f0 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
2a600 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
2a610 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
2a620 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
2a630 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
2a640 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
2a650 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
2a660 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
2a670 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
2a680 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
2a690 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
2a6a0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
2a6b0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
2a6c0 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
2a6d0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2a6e0 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
2a6f0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
2a700 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2a710 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
2a720 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
2a730 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2a740 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
2a750 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
2a760 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
2a770 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
2a780 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
2a790 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
2a7a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
2a7b0 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
2a7c0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
2a7d0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a7f0 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
2a800 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
2a810 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
2a820 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
2a830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2a840 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
2a850 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
2a860 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
2a870 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
2a880 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
2a890 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
2a8a0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
2a8b0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2a8c0 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
2a8d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2a8e0 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
2a8f0 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
2a900 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
2a910 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2a920 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
2a930 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
2a940 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
2a950 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
2a960 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a970 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2a980 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2a990 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
2a9a0 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
2a9b0 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
2a9c0 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
2a9d0 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
2a9e0 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
2a9f0 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
2aa00 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
2aa10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
2aa20 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
2aa30 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
2aa40 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2aa50 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2aa60 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2aa70 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2aa80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2aa90 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2aaa0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
2aab0 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
2aac0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2aad0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
2aae0 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
2aaf0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
2ab00 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2ab10 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
2ab20 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
2ab30 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
2ab40 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
2ab50 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
2ab60 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2ab70 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
2ab80 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
2ab90 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
2aba0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2abb0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2abc0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
2abd0 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
2abe0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2abf0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
2ac00 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
2ac10 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
2ac20 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
2ac30 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
2ac40 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
2ac50 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
2ac60 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
2ac70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2ac80 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2ac90 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2aca0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
2acb0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
2acc0 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
2acd0 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
2ace0 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
2acf0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ad00 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2ad10 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
2ad20 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
2ad30 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
2ad40 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
2ad50 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
2ad60 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
2ad70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
2ad80 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
2ad90 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
2ada0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
2adb0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2adc0 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
2add0 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
2ade0 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
2adf0 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
2ae00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2ae10 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
2ae20 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
2ae30 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
2ae40 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2ae50 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
2ae60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2ae70 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2ae80 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
2ae90 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
2aea0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
2aeb0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
2aec0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2aed0 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
2aee0 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
2aef0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2af00 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2af10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2af20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2af30 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
2af40 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
2af50 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
2af60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2af70 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2af80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2af90 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2afa0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
2afb0 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
2afc0 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
2afd0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
2afe0 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
2aff0 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
2b000 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2b010 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
2b020 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
2b030 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2b040 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
2b050 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
2b060 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
2b070 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
2b080 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
2b090 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
2b0a0 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
2b0b0 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
2b0c0 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
2b0d0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2b0e0 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
2b0f0 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
2b100 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
2b110 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
2b120 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
2b130 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
2b140 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
2b150 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
2b160 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
2b170 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
2b180 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2b190 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2b1a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2b1b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
2b1c0 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
2b1d0 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
2b1e0 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
2b1f0 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
2b200 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2b210 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
2b220 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
2b230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2b250 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
2b260 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b270 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2b280 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2b290 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2b2a0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2b2b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b2c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2b2d0 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
2b2e0 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
2b2f0 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
2b300 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2b310 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
2b320 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
2b330 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
2b340 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2b350 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
2b360 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2b370 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2b380 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2b390 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2b3a0 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
2b3b0 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
2b3c0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2b3d0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2b3e0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2b3f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
2b400 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2b410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2b420 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
2b430 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
2b440 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2b450 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2b460 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2b470 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b480 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b490 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
2b4a0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
2b4b0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
2b4c0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2b4d0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
2b4e0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
2b4f0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
2b500 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
2b510 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2b520 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
2b530 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
2b540 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
2b550 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
2b560 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2b570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
2b580 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
2b590 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
2b5a0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
2b5b0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2b5c0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2b5d0 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
2b5e0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2b5f0 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
2b600 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2b610 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2b620 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2b630 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2b640 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
2b650 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2b660 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b670 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
2b680 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
2b690 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
2b6a0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2b6b0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
2b6c0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
2b6d0 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
2b6e0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2b6f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2b700 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
2b710 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
2b720 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2b730 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2b740 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2b750 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b760 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2b770 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
2b780 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
2b790 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
2b7a0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
2b7b0 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
2b7c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
2b7d0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
2b7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b7f0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
2b800 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
2b810 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
2b820 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
2b830 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
2b840 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
2b850 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
2b860 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
2b870 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
2b880 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2b890 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2b8a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
2b8b0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2b8c0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
2b8d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2b8e0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
2b8f0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
2b900 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
2b910 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
2b920 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
2b930 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
2b940 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
2b950 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
2b960 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
2b970 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
2b980 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
2b990 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
2b9a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2b9b0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
2b9c0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2b9d0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
2b9e0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
2b9f0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
2ba00 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
2ba10 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
2ba20 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
2ba30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2ba40 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
2ba50 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74  int *pRC){.  int
2ba60 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
2ba70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2ba80 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
2ba90 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2baa0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2bab0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2bac0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2bad0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2bae0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2baf0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2bb00 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2bb10 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2bb20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2bb30 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
2bb40 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2bb50 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2bb60 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
2bb70 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
2bb80 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
2bb90 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
2bba0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2bbb0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2bbc0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
2bbd0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
2bbe0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2bbf0 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
2bc00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2bc10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2bc20 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2bc30 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2bc40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2bc50 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2bc60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
2bc70 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2bc80 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
2bc90 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2bca0 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
2bcb0 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
2bcc0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2bcd0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
2bce0 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
2bcf0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2bd00 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
2bd10 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
2bd20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2bd30 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75  );.  if( pc < (u
2bd40 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74  32)get2byte(&dat
2bd50 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
2bd60 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
2bd70 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
2bd80 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
2bd90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2bda0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2bdb0 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
2bdc0 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
2bdd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2bde0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
2bdf0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
2be00 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
2be10 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
2be20 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
2be30 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
2be40 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
2be50 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
2be60 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
2be70 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2be80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2be90 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
2bea0 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
2beb0 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
2bec0 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
2bed0 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
2bee0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
2bef0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
2bf00 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
2bf10 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2bf20 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
2bf30 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
2bf40 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
2bf50 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
2bf60 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
2bf70 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
2bf80 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
2bf90 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
2bfa0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
2bfb0 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
2bfc0 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
2bfd0 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
2bfe0 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
2bff0 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
2c000 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
2c010 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
2c020 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
2c030 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
2c040 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
2c050 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
2c060 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
2c070 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
2c080 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
2c090 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
2c0a0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
2c0b0 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
2c0c0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
2c0d0 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
2c0e0 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
2c0f0 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
2c100 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
2c110 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
2c120 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
2c130 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2c140 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
2c150 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2c160 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
2c170 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
2c180 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
2c190 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
2c1a0 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
2c1b0 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
2c1c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
2c1d0 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
2c1e0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2c1f0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
2c200 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
2c210 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
2c220 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
2c230 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
2c240 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
2c250 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
2c260 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
2c270 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
2c280 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
2c290 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
2c2a0 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
2c2b0 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
2c2c0 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
2c2d0 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
2c2e0 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
2c2f0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
2c300 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
2c310 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
2c320 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
2c330 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
2c340 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
2c350 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
2c360 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
2c370 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
2c380 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
2c390 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
2c3a0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
2c3b0 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
2c3c0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
2c3d0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
2c3e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2c3f0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65  unter */.  int e
2c400 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
2c410 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
2c420 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
2c430 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2c440 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
2c450 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2c460 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
2c470 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
2c480 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
2c490 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
2c4a0 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
2c4b0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
2c4c0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2c4d0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2c4e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
2c4f0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
2c500 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2c510 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
2c520 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
2c530 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
2c540 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
2c550 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20  ..  int nSkip = 
2c560 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29  (iChild ? 4 : 0)
2c570 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  ;..  if( *pRC ) 
2c580 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2c590 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
2c5a0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
2c5b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
2c5c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c5d0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2c5e0 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2c5f0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2c600 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73  )<=10921 );.  as
2c610 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2c620 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
2c630 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20  e(pPage->aOvfl) 
2c640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2c650 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c660 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2c670 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
2c680 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
2c690 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
2c6a0 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
2c6b0 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
2c6c0 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
2c6d0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
2c6e0 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
2c6f0 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
2c700 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
2c710 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
2c720 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
2c730 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
2c740 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
2c750 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
2c760 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
2c770 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
2c780 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
2c790 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
2c7a0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
2c7b0 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
2c7c0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
2c7d0 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
2c7e0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
2c7f0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2c800 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
2c810 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
2c820 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2c830 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
2c840 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
2c850 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
2c860 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
2c870 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
2c880 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2c890 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
2c8a0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
2c8b0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2c8c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
2c8d0 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
2c8e0 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
2c8f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
2c900 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69      assert( j<(i
2c910 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65  nt)(sizeof(pPage
2c920 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
2c930 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2c940 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
2c950 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
2c960 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
2c970 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
2c980 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73  = (u16)i;.  }els
2c990 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
2c9a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c9b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2c9c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2c9d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c9e0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2c9f0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2ca00 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2ca10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ca20 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2ca30 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
2ca40 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2ca50 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
2ca60 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
2ca70 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
2ca80 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
2ca90 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2caa0 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ins = cellOffset
2cab0 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d   + 2*i;.    rc =
2cac0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
2cad0 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
2cae0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
2caf0 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
2cb00 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
2cb10 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
2cb20 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
2cb30 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
2cb40 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20  two properties. 
2cb50 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
2cb60 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  rns success */. 
2cb70 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
2cb80 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61  = end+2 );.    a
2cb90 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
2cba0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2cbb0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
2cbc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
2cbd0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
2cbe0 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
2cbf0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
2cc00 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
2cc10 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
2cc20 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69  Skip);.    if( i
2cc30 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
2cc40 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
2cc50 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
2cc60 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64   }.    for(j=end
2cc70 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
2cc80 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
2cc90 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
2cca0 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
2ccb0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
2ccc0 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
2ccd0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
2cce0 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
2ccf0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
2cd00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
2cd10 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2cd20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2cd30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2cd40 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2cd50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2cd60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2cd70 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
2cd80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2cd90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2cda0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
2cdb0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
2cdc0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2cdd0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
2cde0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
2cdf0 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
2ce00 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
2ce10 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
2ce20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2ce30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2ce40 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
2ce50 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
2ce60 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
2ce70 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
2ce80 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
2ce90 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
2cea0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
2ceb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2cec0 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
2ced0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
2cee0 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
2cef0 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
2cf00 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
2cf10 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
2cf20 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
2cf30 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
2cf40 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
2cf50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
2cf60 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
2cf70 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
2cf80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
2cf90 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
2cfa0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
2cfb0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2cfc0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
2cfd0 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a  pCellptr;     /*
2cfe0 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
2cff0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
2d000 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
2d010 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2d020 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
2d030 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  y */.  u8 * cons
2d040 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
2d050 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
2d060 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d070 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20   data for pPage 
2d080 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  */.  const int h
2d090 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2d0a0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2d0b0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
2d0c0 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ader on pPage */
2d0d0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73  .  const int nUs
2d0e0 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  able = pPage->pB
2d0f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  t->usableSize; /
2d100 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
2d110 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
2d120 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2d130 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
2d140 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2d150 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2d160 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2d170 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30  assert( nCell>=0
2d180 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45   && nCell<=MX_CE
2d190 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
2d1a0 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
2d1b0 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20  >pBt)<=10921);. 
2d1c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d1d0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2d1e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d1f0 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
2d200 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61  that the page ha
2d210 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f  s just been zero
2d220 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29  ed by zeroPage()
2d230 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2d240 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2d250 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62  .  assert( get2b
2d260 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
2d270 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c  [hdr+5])==nUsabl
2d280 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72  e );..  pCellptr
2d290 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
2d2a0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
2d2b0 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2d2c0 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2d2d0 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2d2e0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43  =0; i--){.    pC
2d2f0 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20  ellptr -= 2;.   
2d300 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69   cellbody -= aSi
2d310 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62  ze[i];.    put2b
2d320 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
2d330 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
2d340 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
2d350 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
2d360 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aSize[i]);.  }. 
2d370 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2d380 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
2d390 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2d3a0 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
2d3b0 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
2d3c0 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
2d3d0 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
2d3e0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2d3f0 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
2d400 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
2d410 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
2d420 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
2d430 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
2d440 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
2d450 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
2d460 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2d470 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
2d480 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2d490 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
2d4a0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
2d4b0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
2d4c0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
2d4d0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
2d4e0 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
2d4f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
2d500 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
2d510 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
2d520 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
2d530 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
2d540 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
2d550 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
2d560 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
2d570 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
2d580 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
2d590 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
2d5a0 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
2d5b0 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
2d5c0 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
2d5d0 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
2d5e0 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
2d5f0 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
2d600 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
2d610 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
2d620 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
2d630 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
2d640 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
2d650 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
2d660 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
2d670 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
2d680 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d690 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2d6a0 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2d6b0 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
2d6c0 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
2d6d0 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
2d6e0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
2d6f0 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
2d700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
2d710 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
2d720 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
2d730 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
2d740 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
2d750 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
2d760 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
2d770 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
2d780 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
2d790 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
2d7a0 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
2d7b0 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
2d7c0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
2d7d0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
2d7e0 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
2d7f0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
2d800 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
2d810 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20  ying to balance 
2d820 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
2d830 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
2d840 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
2d850 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
2d860 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
2d870 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
2d880 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
2d890 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
2d8a0 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
2d8b0 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
2d8c0 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
2d8d0 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
2d8e0 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
2d8f0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
2d900 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
2d910 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
2d920 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
2d930 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
2d940 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
2d950 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
2d960 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
2d970 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
2d980 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
2d990 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
2d9a0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2d9b0 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
2d9c0 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
2d9d0 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
2d9e0 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
2d9f0 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
2da00 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
2da10 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
2da20 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
2da30 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
2da40 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
2da50 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
2da60 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
2da70 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
2da80 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2da90 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
2daa0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
2dab0 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
2dac0 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
2dad0 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
2dae0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
2daf0 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
2db00 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
2db10 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
2db20 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
2db30 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
2db40 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
2db50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2db60 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
2db70 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2db80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2db90 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
2dba0 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
2dbb0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2dbc0 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
2dbd0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
2dbe0 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
2dc10 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
2dc20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2dc50 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
2dc60 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dc80 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
2dc90 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
2dca0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2dcb0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2dcc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2dcd0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2dce0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2dcf0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2dd00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2dd10 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
2dd20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  );..  /* This er
2dd30 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ror condition is
2dd40 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
2dd50 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
2dd60 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2dd70 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
2dd80 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l<=0 ) return SQ
2dd90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2dda0 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
2ddb0 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
2ddc0 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2ddd0 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
2dde0 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
2ddf0 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
2de00 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
2de10 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
2de20 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2de30 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
2de40 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
2de50 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
2de60 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
2de70 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
2de80 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2de90 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2dea0 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
2deb0 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
2dec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
2ded0 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
2dee0 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
2def0 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
2df00 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a  aOvfl[0].pCell;.
2df10 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
2df20 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2df30 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
2df40 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
2df50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2df60 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2df70 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
2df80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2df90 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
2dfa0 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2dfb0 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2dfc0 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
2dfd0 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
2dfe0 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2dff0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
2e000 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
2e010 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
2e020 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
2e030 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2e040 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2e050 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
2e060 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
2e070 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
2e080 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
2e090 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
2e0a0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
2e0b0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
2e0c0 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
2e0d0 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
2e0e0 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
2e0f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
2e100 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
2e110 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
2e120 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
2e130 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
2e140 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
2e150 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
2e160 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
2e170 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
2e180 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
2e190 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2e1a0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2e1b0 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
2e1c0 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
2e1d0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
2e1e0 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
2e1f0 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
2e200 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
2e210 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
2e220 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
2e230 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
2e240 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2e250 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2e260 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
2e270 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
2e280 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
2e290 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
2e2a0 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
2e2b0 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
2e2c0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
2e2d0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   pCell, &rc);.  
2e2e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
2e2f0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64     /* Create a d
2e300 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69  ivider cell to i
2e310 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65  nsert into pPare
2e320 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20  nt. The divider 
2e330 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  cell.    ** cons
2e340 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65  ists of a 4-byte
2e350 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68   page number (th
2e360 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2e370 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20   pPage) and.    
2e380 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  ** a variable le
2e390 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28  ngth key value (
2e3a0 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68  which must be th
2e3b0 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
2e3c0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  the.    ** large
2e3d0 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29  st key on pPage)
2e3e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2e3f0 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  To find the larg
2e400 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e  est key value on
2e410 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69   pPage, first fi
2e420 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  nd the right-mos
2e430 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  t .    ** cell o
2e440 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72  n pPage. The fir
2e450 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
2e460 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74   this cell are t
2e470 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  he .    ** recor
2e480 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69  d-length (a vari
2e490 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2e4a0 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62  ger at most 32-b
2e4b0 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20  its in size).   
2e4c0 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20   ** and the key 
2e4d0 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c  value (a variabl
2e4e0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2e4f0 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76  , may have any v
2e500 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68  alue)..    ** Th
2e510 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77  e first of the w
2e520 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20  hile(...) loops 
2e530 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72  below skips over
2e540 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67   the record-leng
2e550 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e  th.    ** field.
2e560 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c   The second whil
2e570 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69  e(...) loop copi
2e580 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  es the key value
2e590 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
2e5a0 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69   cell on pPage i
2e5b0 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62  nto the pSpace b
2e5c0 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  uffer..    */.  
2e5d0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2e5e0 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
2e5f0 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70  >nCell-1);.    p
2e600 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
2e610 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28  ;.    while( (*(
2e620 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26  pCell++)&0x80) &
2e630 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
2e640 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2e650 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2e660 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d  e( ((*(pOut++) =
2e670 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38   *(pCell++))&0x8
2e680 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
2e690 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  p );..    /* Ins
2e6a0 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  ert the new divi
2e6b0 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50  der cell into pP
2e6c0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  arent. */.    in
2e6d0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
2e6e0 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  , pParent->nCell
2e6f0 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28  , pSpace, (int)(
2e700 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20  pOut-pSpace),.  
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
2e720 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63  pPage->pgno, &rc
2e730 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
2e740 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
2e750 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e  ointer of pParen
2e760 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2e770 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
2e780 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2e790 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2e7a0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2e7b0 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
2e7c0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
2e7d0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2e7e0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
2e7f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2e800 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
2e810 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
2e820 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2e830 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
2e840 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54  /..#if 0./*.** T
2e850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2e860 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
2e870 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
2e880 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51   operation of SQ
2e890 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73  Lite..** it is s
2e8a0 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74  ometimes activat
2e8b0 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77  ed temporarily w
2e8c0 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63  hile debugging c
2e8d0 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  ode responsible 
2e8e0 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20  .** for setting 
2e8f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2e900 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ies..*/.static i
2e910 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  nt ptrmapCheckPa
2e920 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70  ges(MemPage **ap
2e930 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29  Page, int nPage)
2e940 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
2e950 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65  for(i=0; i<nPage
2e960 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f  ; i++){.    Pgno
2e970 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20   n;.    u8 e;.  
2e980 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e990 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20   = apPage[i];.  
2e9a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2e9b0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2e9c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e9d0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20  >isInit );..    
2e9e0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65  for(j=0; j<pPage
2e9f0 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20  ->nCell; j++){. 
2ea00 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
2ea10 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b  fo;.      u8 *z;
2ea20 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d  .     .      z =
2ea30 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2ea40 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65   j);.      btree
2ea50 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2ea60 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
2ea70 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
2ea80 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
2ea90 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
2eaa0 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
2eab0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
2eac0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2ead0 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
2eae0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2eaf0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2eb00 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
2eb10 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
2eb20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2eb30 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2eb40 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
2eb50 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
2eb60 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2eb70 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
2eb80 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
2eb90 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2eba0 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2ebb0 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
2ebc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2ebd0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2ebe0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
2ebf0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
2ec00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ec10 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2ec20 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
2ec30 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
2ec40 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
2ec50 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2ec60 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2ec70 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
2ec80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2ec90 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2eca0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ecb0 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
2ecc0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2ecd0 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
2ece0 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
2ecf0 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
2ed00 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
2ed10 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
2ed20 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
2ed30 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2ed40 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
2ed50 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
2ed60 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
2ed70 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
2ed80 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
2ed90 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
2eda0 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
2edb0 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
2edc0 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
2edd0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2ede0 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
2edf0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
2ee00 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
2ee10 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
2ee20 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
2ee30 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
2ee40 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
2ee50 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
2ee60 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
2ee70 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
2ee80 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
2ee90 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76  e.** MemPage.aOv
2eea0 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65  fl[] array), the
2eeb0 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64  y are not copied
2eec0 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20   to pTo. .**.** 
2eed0 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
2eee0 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65  , page pTo is re
2eef0 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e  initialized usin
2ef00 67 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  g btreeInitPage(
2ef10 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72  )..**.** The per
2ef20 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73  formance of this
2ef30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74   function is not
2ef40 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73   critical. It is
2ef50 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a   only used by .*
2ef60 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68  * the balance_sh
2ef70 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61  allower() and ba
2ef80 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70  lance_deeper() p
2ef90 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68  rocedures, neith
2efa0 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61  er of.** which a
2efb0 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20  re called often 
2efc0 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72  under normal cir
2efd0 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73  cumstances..*/.s
2efe0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e  tatic void copyN
2eff0 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61  odeContent(MemPa
2f000 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61  ge *pFrom, MemPa
2f010 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52  ge *pTo, int *pR
2f020 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
2f030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f040 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f     BtShared * co
2f050 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d  nst pBt = pFrom-
2f060 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63  >pBt;.    u8 * c
2f070 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72  onst aFrom = pFr
2f080 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75  om->aData;.    u
2f090 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20  8 * const aTo = 
2f0a0 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  pTo->aData;.    
2f0b0 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48  int const iFromH
2f0c0 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f  dr = pFrom->hdrO
2f0d0 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63  ffset;.    int c
2f0e0 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28  onst iToHdr = ((
2f0f0 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20  pTo->pgno==1) ? 
2f100 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e  100 : 0);.    in
2f110 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44  t rc;.    int iD
2f120 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61  ata;.  .  .    a
2f130 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
2f140 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65  Init );.    asse
2f150 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65  rt( pFrom->nFree
2f160 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20  >=iToHdr );.    
2f170 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
2f180 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
2f190 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c  +5])<=pBt->usabl
2f1a0 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
2f1b0 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
2f1c0 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
2f1d0 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
2f1e0 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
2f1f0 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
2f200 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2f210 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
2f220 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
2f230 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
2f240 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2f250 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
2f260 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
2f270 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
2f280 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
2f290 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
2f2a0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
2f2b0 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
2f2c0 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
2f2d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2f2e0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
2f2f0 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
2f300 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
2f310 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
2f320 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20  tion of pTo can 
2f330 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e  actually fail un
2f340 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c  der.    ** fairl
2f350 79 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d  y obscure circum
2f360 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68  stances, even th
2f370 6f 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70  ough it is a cop
2f380 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  y of initialized
2f390 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46   .    ** page pF
2f3a0 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rom..    */.    
2f3b0 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
2f3c0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
2f3d0 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20  nitPage(pTo);.  
2f3e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f3f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
2f400 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
2f410 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
2f420 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2f430 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2f440 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
2f450 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f460 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
2f470 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
2f480 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
2f490 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
2f4a0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
2f4b0 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20  ers to..    */. 
2f4c0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2f4d0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  UUM ){.      *pR
2f4e0 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  C = setChildPtrm
2f4f0 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  aps(pTo);.    }.
2f500 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
2f510 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
2f520 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
2f530 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
2f540 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
2f550 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
2f560 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
2f570 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
2f580 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
2f590 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
2f5a0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
2f5b0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
2f5c0 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
2f5d0 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
2f5e0 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
2f5f0 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
2f600 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
2f610 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
2f620 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
2f630 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
2f640 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
2f650 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
2f660 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
2f670 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
2f680 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
2f690 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
2f6a0 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
2f6b0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
2f6c0 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
2f6d0 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
2f6e0 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
2f6f0 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
2f700 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
2f710 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
2f720 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2f730 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
2f740 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2f750 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
2f760 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
2f770 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
2f780 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
2f790 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
2f7a0 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
2f7b0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
2f7c0 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
2f7d0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
2f7e0 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
2f7f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
2f800 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
2f810 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
2f820 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
2f830 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
2f840 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
2f850 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
2f860 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
2f870 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
2f880 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2f890 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
2f8a0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
2f8b0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
2f8c0 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
2f8d0 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
2f8e0 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
2f8f0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
2f900 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
2f910 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
2f920 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
2f930 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
2f940 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
2f950 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
2f960 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2f970 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
2f980 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
2f990 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2f9a0 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
2f9b0 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
2f9c0 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
2f9d0 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
2f9e0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2f9f0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
2fa00 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
2fa10 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
2fa20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
2fa30 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
2fa40 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
2fa50 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
2fa60 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
2fa70 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
2fa80 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
2fa90 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
2faa0 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
2fab0 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
2fac0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2fad0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
2fae0 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
2faf0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
2fb00 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
2fb10 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2fb20 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
2fb30 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
2fb40 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62  to a.** buffer b
2fb50 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
2fb60 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77  d one page. If w
2fb70 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63  hile inserting c
2fb80 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
2fb90 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50  rent.** page (pP
2fba0 61 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e  arent) the paren
2fbb0 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
2fbc0 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75  verfull, this bu
2fbd0 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20  ffer is.** used 
2fbe0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72  to store the par
2fbf0 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63  ent's overflow c
2fc00 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68  ells. Because th
2fc10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65  is function inse
2fc20 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d  rts.** a maximum
2fc30 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72   of four divider
2fc40 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
2fc50 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64  parent page, and
2fc60 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
2fc70 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73  size of a cell s
2fc80 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20  tored within an 
2fc90 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
2fca0 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61   always less tha
2fcb0 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20  n 1/4.** of the 
2fcc0 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61  page-size, the a
2fcd0 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66  OvflSpace[] buff
2fce0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
2fcf0 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
2fd00 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f  enough for all o
2fd10 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
2fd20 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61  *.** If aOvflSpa
2fd30 63 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  ce is set to a n
2fd40 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ull pointer, thi
2fd50 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2fd60 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ns .** SQLITE_NO
2fd70 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  MEM..*/.static i
2fd80 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
2fd90 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ot(.  MemPage *p
2fda0 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
2fdb0 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
2fdc0 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73  page of siblings
2fdd0 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
2fde0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
2fdf0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
2fe00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2fe10 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20 70   "the page" in p
2fe20 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a  Parent */.  u8 *
2fe30 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20  aOvflSpace,     
2fe40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2fe50 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f  age-size bytes o
2fe60 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72 65  f space for pare
2fe70 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74  nt ovfl */.  int
2fe80 20 69 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20   isRoot         
2fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fea0 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
2feb0 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a  is a root-page *
2fec0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
2fed0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
2fee0 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
2fef0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
2ff00 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ff20 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
2ff30 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
2ff40 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
2ff50 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2ff60 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
2ff70 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
2ff80 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
2ff90 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20  t nNew = 0;     
2ffa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ffb0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2ffc0 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
2ffd0 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  t nOld;         
2ffe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2fff0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
30000 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
30010 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
30020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
30030 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
30040 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
30050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30060 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
30070 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
30080 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
30090 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
300a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
300b0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
300c0 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74   u16 leafCorrect
300d0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
300e0 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
300f0 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
30100 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
30110 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
30120 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
30130 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
30140 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
30150 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
30160 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
30170 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
30180 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
30190 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
301a0 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
301b0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
301c0 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
301d0 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
301e0 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
301f0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
30200 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
30210 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
30220 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
30230 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
30240 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
30250 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
30260 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  e1[] */.  int iO
30270 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20  vflSpace = 0;   
30280 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
30290 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
302a0 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20  OvflSpace[] */. 
302b0 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20   int szScratch; 
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
302d0 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68   Size of scratch
302e0 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65   memory requeste
302f0 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
30300 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
30310 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
30320 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
30330 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ngs */.  MemPage
30340 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
30350 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
30360 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
30370 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
30380 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
30390 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
303a0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
303b0 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
303c0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75  balancing */.  u
303d0 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20  8 *pRight;      
303e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
303f0 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e  ocation in paren
30400 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69  t of right-sibli
30410 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ng pointer */.  
30420 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b  u8 *apDiv[NB-1];
30430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30440 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
30450 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
30460 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
30470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
30480 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
30490 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
304a0 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
304b0 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
304c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
304d0 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
304e0 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
304f0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
30500 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
30510 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
30520 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
30530 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
30540 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
30550 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
30560 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
30570 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
30580 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
305a0 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
305b0 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
305c0 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ells */.  Pgno p
305d0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
305e0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76         /* Temp v
305f0 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61  ar to store a pa
30600 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a  ge number in */.
30610 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74  .  pBt = pParent
30620 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
30630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30640 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
30650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30660 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30670 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
30680 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30  bPage) );..#if 0
30690 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
306a0 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25  CE: begin page %
306b0 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22  d child of %d\n"
306c0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
306d0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a  Parent->pgno));.
306e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20  #endif..  /* At 
306f0 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65  this point pPare
30700 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d  nt may have at m
30710 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77  ost one overflow
30720 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20   cell. And if.  
30730 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  ** this overflow
30740 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74   cell is present
30750 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65  , it must be the
30760 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a   cell with .  **
30770 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64   index iParentId
30780 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f  x. This scenario
30790 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65   comes about whe
307a0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
307b0 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28    ** is called (
307c0 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d  indirectly) from
307d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
307e0 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ete()..  */.  as
307f0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
30800 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
30810 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
30820 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  w==1 );.  assert
30830 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
30840 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
30850 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
30860 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a  ==iParentIdx );.
30870 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61  .  if( !aOvflSpa
30880 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ce ){.    return
30890 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
308a0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
308b0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
308c0 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f  to balance. Also
308d0 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   locate the cell
308e0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20  s in pParent .  
308f0 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74  ** that divide t
30900 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20  he siblings. An 
30910 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
30920 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
30930 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74  ngs on .  ** eit
30940 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
30950 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  e. More siblings
30960 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
30970 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
30980 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  r, .  ** if ther
30990 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
309a0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
309b0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
309c0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
309d0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
309e0 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
309f0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
30a00 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
30a10 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
30a20 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70  s loop also drop
30a30 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  s the divider ce
30a40 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72  lls from the par
30a50 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20  ent page. This. 
30a60 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d   ** way, the rem
30a70 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75  ainder of the fu
30a80 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
30a90 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74  have to deal wit
30aa0 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66  h any.  ** overf
30ab0 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  low cells in the
30ac0 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69   parent page, si
30ad0 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74  nce if any exist
30ae0 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a  ed they will.  *
30af0 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  * have already b
30b00 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a  een removed..  *
30b10 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d  /.  i = pParent-
30b20 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61  >nOverflow + pPa
30b30 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  rent->nCell;.  i
30b40 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78  f( i<2 ){.    nx
30b50 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c  Div = 0;.    nOl
30b60 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65  d = i+1;.  }else
30b70 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a  {.    nOld = 3;.
30b80 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49      if( iParentI
30b90 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  dx==0 ){        
30ba0 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
30bb0 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d  nxDiv = 0;.    }
30bc0 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74  else if( iParent
30bd0 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  Idx==i ){.      
30be0 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20  nxDiv = i-2;.   
30bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78   }else{.      nx
30c00 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78  Div = iParentIdx
30c10 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  -1;.    }.    i 
30c20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  = 2;.  }.  if( (
30c30 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
30c40 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61  >nOverflow)==pPa
30c50 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
30c60 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61     pRight = &pPa
30c70 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
30c80 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
30c90 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
30ca0 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c  pRight = findCel
30cb0 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
30cc0 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
30cd0 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67  rflow);.  }.  pg
30ce0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52  no = get4byte(pR
30cf0 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  ight);.  while( 
30d00 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  1 ){.    rc = ge
30d10 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
30d20 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69  , pgno, &apOld[i
30d30 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
30d40 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  {.      memset(a
30d50 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
30d60 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
30d70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c  ;.      goto bal
30d80 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
30d90 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c    }.    nMaxCell
30da0 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
30db0 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
30dc0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
30dd0 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62  if( (i--)==0 ) b
30de0 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69  reak;..    if( i
30df0 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d  +nxDiv==pParent-
30e00 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26  >aOvfl[0].idx &&
30e10 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
30e20 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44  low ){.      apD
30e30 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d  iv[i] = pParent-
30e40 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
30e50 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
30e60 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
30e70 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
30e80 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
30e90 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
30ea0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
30eb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
30ec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30ed0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
30ee0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
30ef0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
30f00 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
30f10 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
30f20 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
30f30 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
30f40 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
30f50 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
30f60 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
30f70 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
30f80 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
30f90 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
30fa0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
30fb0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
30fc0 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
30fd0 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
30fe0 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
30ff0 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
31000 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
31010 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
31020 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
31030 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
31040 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e   bytes of it, an
31050 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
31060 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68  does not need th
31070 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
31080 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74   four bytes of t
31090 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e  he divider cell.
310a0 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   So the pointer 
310b0 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20  is safe to use. 
310c0 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e       ** later on
310d0 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  .  .      **.   
310e0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c     ** Unless SQL
310f0 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
31100 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  in secure-delete
31110 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
31120 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ase,.      ** th
31130 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75  e dropCell() rou
31140 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72  tine will overwr
31150 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63  ite the entire c
31160 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e  ell with zeroes.
31170 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
31180 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72  s case, temporar
31190 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c  ily copy the cel
311a0 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c  l into the aOvfl
311b0 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a  Space[].      **
311c0 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c   buffer. It will
311d0 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61   be copied out a
311e0 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20  gain as soon as 
311f0 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66  the aSpace[] buf
31200 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  fer.      ** is 
31210 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
31220 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 73 65       if( pBt->se
31230 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
31240 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
31250 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
31260 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53  NT(apDiv[i]) - S
31270 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
31280 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
31290 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
312a0 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69  Off+szNew[i])>(i
312b0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
312c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
312d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
312e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
312f0 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
31300 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
31310 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
31320 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
31330 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
31340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31350 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
31360 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c  OvflSpace[iOff],
31370 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
31380 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
31390 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66  apDiv[i] = &aOvf
313a0 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
313b0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b  pParent->aData];
313c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
313d0 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c   }.      dropCel
313e0 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
313f0 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
31400 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
31410 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
31420 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
31430 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
31440 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
31450 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
31460 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
31470 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
31480 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
31490 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
314a0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
314b0 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
314c0 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
314d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
314e0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
314f0 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
31500 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
31510 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
31520 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
31530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
31540 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
31550 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
31560 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
31570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
31580 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
31590 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
315c0 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
315d0 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31600 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
31610 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
31620 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
31630 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
31640 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
31650 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
31660 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
31670 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
31680 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
31690 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
316a0 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
316b0 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
316c0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
316d0 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
316e0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
316f0 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
31700 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
31710 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
31720 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
31730 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
31740 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
31750 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
31760 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
31770 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
31780 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
31790 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
317a0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
317b0 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
317c0 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65  d remove the the
317d0 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20   divider Cells. 
317e0 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
317f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
31800 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
31810 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
31820 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
31830 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
31840 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
31850 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
31860 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
31870 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
31880 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
31890 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
318a0 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
318b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
318c0 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
318d0 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
318e0 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
318f0 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
31900 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
31910 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
31920 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
31930 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
31940 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
31950 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
31960 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
31970 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
31980 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
31990 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
319a0 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
319b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
319c0 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
319d0 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
319e0 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
319f0 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
31a00 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
31a10 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
31a20 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
31a30 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68  ta = apOld[0]->h
31a40 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
31a50 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
31a60 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  .    int limit;.
31a70 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f      .    /* Befo
31a80 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
31a90 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63  g else, take a c
31aa0 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20  opy of the i'th 
31ab0 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67  original sibling
31ac0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74  .    ** The rest
31ad0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
31ae0 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
31af0 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
31b00 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68  rather.    ** th
31b10 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
31b20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
31b30 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
31b40 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
31b50 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
31b60 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
31b70 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  n.  */.    MemPa
31b80 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
31b90 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
31ba0 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70  )&aSpace1[pBt->p
31bb0 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a  ageSize + k*i];.
31bc0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c      memcpy(pOld,
31bd0 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
31be0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
31bf0 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28   pOld->aData = (
31c00 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a  void*)&pOld[1];.
31c10 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d      memcpy(pOld-
31c20 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
31c30 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
31c40 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69  geSize);..    li
31c50 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
31c60 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
31c70 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  w;.    for(j=0; 
31c80 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20  j<limit; j++){. 
31c90 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
31ca0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
31cb0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
31cc0 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
31cd0 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
31ce0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
31cf0 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
31d00 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
31d10 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e  nCell]);.      n
31d20 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
31d30 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26    if( i<nOld-1 &
31d40 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20  & !leafData){.  
31d50 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31      u16 sz = (u1
31d60 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  6)szNew[i];.    
31d70 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
31d80 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
31d90 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
31da0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
31db0 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54  ] = sz;.      pT
31dc0 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
31dd0 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69  Space1];.      i
31de0 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
31df0 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
31e00 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
31e10 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31e20 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
31e30 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
31e40 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
31e50 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
31e60 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
31e70 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
31e80 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
31e90 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
31ea0 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
31eb0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
31ec0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
31ed0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
31ee0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
31ef0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
31f00 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
31f10 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31f20 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
31f30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
31f40 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
31f50 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
31f60 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
31f70 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
31f80 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
31f90 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
31fa0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
31fb0 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
31fc0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
31fd0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
31fe0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
31ff0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
32000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32010 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
32020 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
32030 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
32040 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
32050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
32060 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
32070 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
32080 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
32090 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
320a0 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
320b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
320c0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
320d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
320e0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
320f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
32100 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
32110 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
32120 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
32130 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
32140 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
32150 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
32160 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
32170 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
32180 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
32190 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
321a0 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
321b0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
321c0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
321d0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
321e0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
321f0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
32200 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
32210 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
32220 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
32230 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
32240 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
32250 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
32260 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
32270 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
32280 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
32290 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
322a0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
322b0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
322c0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
322d0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
322e0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
322f0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
32300 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
32310 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
32320 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
32330 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
32340 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
32350 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
32360 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
32370 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
32380 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
32390 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
323a0 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
323b0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
323c0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
323d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
323e0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
323f0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
32400 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
32410 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
32420 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
32430 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
32440 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
32450 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
32460 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
32470 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
32480 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
32490 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
324a0 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
324b0 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
324c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
324d0 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
324e0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
324f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
32500 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
32510 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
32520 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
32530 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
32540 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
32550 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
32560 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
32570 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
32580 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
32590 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
325a0 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
325b0 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
325c0 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
325d0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
325e0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
325f0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
32600 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
32610 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
32620 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
32630 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
32640 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
32650 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
32660 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
32670 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
32680 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
32690 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
326a0 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
326b0 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
326c0 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
326d0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
326e0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
326f0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
32700 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
32710 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
32720 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
32730 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
32740 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
32750 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
32760 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
32770 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
32780 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
32790 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
327a0 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
327b0 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
327c0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
327d0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
327e0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
327f0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
32800 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
32810 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
32820 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
32830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
32840 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
32850 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
32860 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
32870 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
32880 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
32890 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
328a0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
328b0 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
328c0 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
328d0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
328e0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
328f0 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
32900 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
32910 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
32920 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
32930 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
32940 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
32950 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
32960 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
32970 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
32980 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
32990 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
329a0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
329b0 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
329c0 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
329d0 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
329e0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
329f0 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
32a00 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
32a10 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
32a20 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
32a30 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
32a40 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
32a50 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
32a60 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
32a70 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
32a80 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
32a90 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
32aa0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
32ab0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
32ac0 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
32ad0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
32ae0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
32af0 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42   );..  TRACE(("B
32b00 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
32b10 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
32b20 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
32b30 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
32b40 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
32b50 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
32b60 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
32b70 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
32b80 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
32b90 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
32ba0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
32bb0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
32bc0 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
32bd0 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
32be0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32bf0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
32c00 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
32c10 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67  ;.  }.  pageFlag
32c20 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44  s = apOld[0]->aD
32c30 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
32c40 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
32c50 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
32c60 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
32c70 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
32c80 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
32c90 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
32ca0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
32cb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
32cc0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
32cd0 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
32ce0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
32cf0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
32d00 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
32d10 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
32d20 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
32d30 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
32d40 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
32d50 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30  , &pgno, pgno, 0
32d60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
32d70 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
32d80 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
32d90 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
32da0 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20       nNew++;..  
32db0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70      /* Set the p
32dc0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
32dd0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62   for the new sib
32de0 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
32df0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
32e00 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
32e10 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
32e20 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  New->pgno, PTRMA
32e30 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
32e40 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
32e50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32e70 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
32e80 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
32e90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32ea0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
32eb0 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
32ec0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
32ed0 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
32ee0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
32ef0 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66   i<nOld ){.    f
32f00 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
32f10 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
32f20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
32f30 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
32f40 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
32f50 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
32f60 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
32f70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
32f80 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
32f90 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
32fa0 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
32fb0 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
32fc0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
32fd0 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
32fe0 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
32ff0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
33000 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
33010 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
33020 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
33030 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
33040 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
33050 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
33060 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
33070 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
33080 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
33090 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
330a0 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
330b0 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
330c0 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
330d0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
330e0 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
330f0 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
33100 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
33110 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
33120 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
33130 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
33140 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
33150 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
33160 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
33170 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
33180 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
33190 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
331a0 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
331b0 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70     int minV = ap
331c0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
331d0 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
331e0 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
331f0 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
33200 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  if( apNew[j]->pg
33210 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  no<(unsigned)min
33220 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
33230 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
33240 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e  inV = apNew[j]->
33250 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
33260 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
33270 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >i ){.      int 
33280 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  t;.      MemPage
33290 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20   *pT;.      t = 
332a0 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
332b0 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
332c0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  [i];.      apNew
332d0 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
332e0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  ];.      apNew[m
332f0 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
33300 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e  .  }.  TRACE(("n
33310 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
33320 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
33330 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61  %d(%d)\n",.    a
33340 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73  pNew[0]->pgno, s
33350 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
33360 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d  w>=2 ? apNew[1]-
33370 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
33380 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
33390 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
333a0 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20   apNew[2]->pgno 
333b0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
333c0 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
333d0 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77   nNew>=4 ? apNew
333e0 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [3]->pgno : 0, n
333f0 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
33400 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
33410 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70  =5 ? apNew[4]->p
33420 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  gno : 0, nNew>=5
33430 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
33440 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
33450 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
33460 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
33470 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74  DbPage) );.  put
33480 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70  4byte(pRight, ap
33490 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
334a0 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  o);..  /*.  ** E
334b0 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
334c0 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
334d0 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
334e0 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
334f0 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
33500 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
33510 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
33520 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
33530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
33540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
33550 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
33560 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
33570 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
33580 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
33590 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
335a0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65  xCells );.    ze
335b0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
335c0 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73  eFlags);.    ass
335d0 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
335e0 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
335f0 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
33600 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
33610 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
33620 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
33630 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
33640 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
33650 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
33660 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  ;..    j = cntNe
33670 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
33680 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
33690 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
336a0 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
336b0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
336c0 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
336d0 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
336e0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
336f0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
33700 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31  assert( i<nNew-1
33710 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a   || j==nCell );.
33720 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20      if( j<nCell 
33730 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
33740 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
33750 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
33760 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
33770 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
33780 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
33790 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
337a0 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
337b0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
337c0 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
337d0 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c  aOvflSpace[iOvfl
337e0 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66  Space];.      if
337f0 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
33800 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
33810 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
33820 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
33830 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
33840 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
33850 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
33860 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
33870 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
33880 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
33890 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
338a0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
338b0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
338c0 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
338d0 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
338e0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
338f0 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
33900 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
33910 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
33920 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
33930 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
33940 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
33950 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
33960 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
33970 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
33980 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62    j--;.        b
33990 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
339a0 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
339b0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
339c0 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
339d0 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
339e0 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
339f0 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
33a00 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
33a10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
33a20 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
33a30 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
33a40 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
33a50 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
33a60 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
33a70 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
33a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
33a90 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
33aa0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
33ab0 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
33ac0 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
33ad0 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
33ae0 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
33af0 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
33b00 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
33b10 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73  * (see btreePars
33b20 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
33b30 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
33b40 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
33b50 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
33b60 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
33b70 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
33b80 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
33b90 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
33ba0 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
33bb0 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
33bc0 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
33bd0 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
33be0 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
33bf0 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
33c00 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
33c10 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
33c20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
33c30 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
33c40 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
33c50 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
33c60 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
33c70 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
33c80 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
33c90 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
33ca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
33cb0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
33cc0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
33cd0 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
33ce0 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
33cf0 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
33d00 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
33d10 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
33d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
33d30 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a  vflSpace += sz;.
33d40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
33d50 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
33d60 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
33d70 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d  rt( iOvflSpace<=
33d80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
33d90 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c  .      insertCel
33da0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
33db0 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
33dc0 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  mp, pNew->pgno, 
33dd0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
33de0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33df0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
33e00 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65  anup;.      asse
33e10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
33e20 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
33e30 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
33e40 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  ..      j++;.   
33e50 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
33e60 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
33e70 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
33e80 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
33e90 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
33ea0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
33eb0 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
33ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  ==0 ){.    u8 *z
33ed0 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b  Child = &apCopy[
33ee0 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
33ef0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ];.    memcpy(&a
33f00 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
33f10 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20  ata[8], zChild, 
33f20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  4);.  }..  if( i
33f30 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74  sRoot && pParent
33f40 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
33f50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
33f60 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  <=apNew[0]->nFre
33f70 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e ){.    /* The 
33f80 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
33f90 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74   b-tree now cont
33fa0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54  ains no cells. T
33fb0 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a  he only sibling.
33fc0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74      ** page is t
33fd0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
33fe0 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f  f the parent. Co
33ff0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
34000 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68  of the.    ** ch
34010 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68  ild page into th
34020 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61  e parent, decrea
34030 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c  sing the overall
34040 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20   height of the. 
34050 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72     ** b-tree str
34060 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54  ucture by one. T
34070 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64  his is described
34080 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65   as the "balance
34090 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20  -shallower".    
340a0 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d  ** sub-algorithm
340b0 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e   in some documen
340c0 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20  tation..    **. 
340d0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
340e0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
340f0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61  database, the ca
34100 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f  ll to copyNodeCo
34110 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20  ntent() .    ** 
34120 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72  sets all pointer
34130 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
34140 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61  responding to da
34150 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67  tabase image pag
34160 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77  es .    ** for w
34170 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72  hich the pointer
34180 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69   is stored withi
34190 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  n the content be
341a0 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20  ing copied..    
341b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
341c0 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f  cond assert belo
341d0 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  w verifies that 
341e0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69  the child page i
341f0 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20  s defragmented. 
34200 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62     ** (it must b
34210 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73  e, as it was jus
34220 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20  t reconstructed 
34230 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61  using assemblePa
34240 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20  ge()). This.    
34250 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ** is important 
34260 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  if the parent pa
34270 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
34280 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
34290 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69  atabase.    ** i
342a0 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  mage.  */.    as
342b0 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b  sert( nNew==1 );
342c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e  .    assert( apN
342d0 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20  ew[0]->nFree == 
342e0 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79  .        (get2by
342f0 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44  te(&apNew[0]->aD
34300 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d  ata[5])-apNew[0]
34310 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e  ->cellOffset-apN
34320 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20  ew[0]->nCell*2) 
34330 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79  .    );.    copy
34340 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65  NodeContent(apNe
34350 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26  w[0], pParent, &
34360 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67  rc);.    freePag
34370 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29  e(apNew[0], &rc)
34380 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  ;.  }else if( IS
34390 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
343a0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
343b0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
343c0 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
343d0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
343e0 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
343f0 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
34400 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
34410 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
34420 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
34430 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
34440 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
34450 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
34460 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
34470 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
34480 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
34490 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
344a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
344b0 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
344c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
344d0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
344e0 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
344f0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
34500 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
34510 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
34520 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
34530 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
34540 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
34550 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
34560 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
34570 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
34580 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
34590 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
345a0 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
345b0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
345c0 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
345d0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
345e0 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
345f0 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
34600 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
34610 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
34620 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
34630 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
34640 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
34650 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
34660 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
34670 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
34680 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
34690 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
346a0 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
346b0 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
346c0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
346d0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
346e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
346f0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
34700 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
34710 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
34720 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
34730 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
34740 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
34750 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
34760 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
34770 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
34780 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
34790 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
347a0 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
347b0 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
347c0 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
347d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
347e0 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
347f0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
34800 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
34810 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
34820 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
34830 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
34840 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
34850 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
34860 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
34870 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
34880 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
34890 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
348a0 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
348b0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
348c0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
348d0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
348e0 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
348f0 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
34900 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
34910 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
34920 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
34930 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
34940 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
34950 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
34960 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
34970 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
34980 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
34990 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
349a0 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
349b0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
349c0 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
349d0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
349e0 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
349f0 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
34a00 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
34a10 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
34a20 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
34a30 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
34a40 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
34a50 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
34a60 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
34a70 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
34a80 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
34a90 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
34aa0 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
34ab0 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
34ac0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
34ad0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
34ae0 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
34af0 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
34b00 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
34b10 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
34b20 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20  dx : -1);.    j 
34b30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
34b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b50 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64   /* Current 'old
34b60 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
34b70 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20  /.    k = 0;    
34b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
34ba0 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e  ent 'new' siblin
34bb0 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f  g page */.    fo
34bc0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
34bd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
34be0 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20  isDivider = 0;. 
34bf0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69       while( i==i
34c00 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20  NextOld ){.     
34c10 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
34c20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
34c30 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
34c40 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
34c50 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  old.        ** s
34c60 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49  ibling page j. I
34c70 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
34c80 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
34c90 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
34ca0 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
34cb0 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61  , then cell i wa
34cc0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
34cd0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c  . */.        pOl
34ce0 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b  d = apCopy[++j];
34cf0 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c  .        iNextOl
34d00 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  d = i + !leafDat
34d10 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  a + pOld->nCell 
34d20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  + pOld->nOverflo
34d30 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  w;.        if( p
34d40 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  Old->nOverflow )
34d50 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65  {.          nOve
34d60 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f  rflow = pOld->nO
34d70 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
34d80 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69     iOverflow = i
34d90 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
34da0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
34db0 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
34dc0 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
34dd0 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
34de0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
34df0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
34e00 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
34e10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
34e20 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
34e30 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
34e40 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  ==pOld->aOvfl[1]
34e50 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61  .idx-1);.      a
34e60 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
34e70 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  3 || pOld->aOvfl
34e80 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [1].idx==pOld->a
34e90 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[2].idx-1);.
34ea0 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76        if( i==iOv
34eb0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
34ec0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b    isDivider = 1;
34ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d  .        if( (--
34ee0 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a  nOverflow)>0 ){.
34ef0 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
34f00 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  low++;.        }
34f10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
34f20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d  if( i==cntNew[k]
34f30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
34f40 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
34f50 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
34f60 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
34f70 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20   cell on new.   
34f80 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
34f90 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73  page k. If the s
34fa0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
34fb0 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
34fc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
34fd0 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
34fe0 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69  cell i is a divi
34ff0 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  der cell.  */.  
35000 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
35010 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20  ew[++k];.       
35020 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29   if( !leafData )
35030 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
35040 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
35050 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
35060 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
35070 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
35080 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
35090 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
350a0 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
350b0 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
350c0 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
350d0 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
350e0 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
350f0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
35100 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
35110 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
35120 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
35130 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
35140 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
35150 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
35160 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
35170 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
35180 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
35190 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
351a0 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d  Divider || pOld-
351b0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
351c0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
351d0 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
351e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
351f0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
35200 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29  4byte(apCell[i])
35210 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
35220 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  pNew->pgno, &rc)
35230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35240 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69      if( szCell[i
35250 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  ]>pNew->minLocal
35260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
35270 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
35280 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  New, apCell[i], 
35290 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &rc);.        }.
352a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
352b0 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72     if( !leafCorr
352c0 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ection ){.      
352d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
352e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
352f0 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74  32 key = get4byt
35300 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61  e(&apNew[i]->aDa
35310 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
35320 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b  ptrmapPut(pBt, k
35330 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ey, PTRMAP_BTREE
35340 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  , apNew[i]->pgno
35350 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
35360 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20      }..#if 0.   
35370 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68   /* The ptrmapCh
35380 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61  eckPages() conta
35390 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61  ins assert() sta
353a0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72  tements that ver
353b0 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ify that.    ** 
353c0 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  all pointer map 
353d0 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f  pages are set co
353e0 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73  rrectly. This is
353f0 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a   helpful while .
35400 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67      ** debugging
35410 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
35420 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75  y disabled becau
35430 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  se a corrupt dat
35440 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a  abase may.    **
35450 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74   cause an assert
35460 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  () statement to 
35470 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74  fail.  */.    pt
35480 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61  rmapCheckPages(a
35490 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  pNew, nNew);.   
354a0 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
354b0 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  s(&pParent, 1);.
354c0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
354d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
354e0 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45  sInit );.  TRACE
354f0 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
35500 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  shed: old=%d new
35510 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
35520 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c  .          nOld,
35530 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
35540 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
35550 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
35560 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
35570 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
35580 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
35590 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
355a0 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
355b0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
355c0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
355d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
355e0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
355f0 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
35600 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  i]);.  }..  retu
35610 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
35620 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
35630 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
35640 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
35650 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
35660 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  e is.** overfull
35670 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   (has one or mor
35680 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
35690 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63  )..**.** A new c
356a0 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c  hild page is all
356b0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63  ocated and the c
356c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
356d0 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70  urrent root.** p
356e0 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  age, including o
356f0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61  verflow cells, a
35700 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  re copied into t
35710 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f  he child. The ro
35720 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68  ot.** page is th
35730 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74  en overwritten t
35740 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70  o make it an emp
35750 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65  ty page with the
35760 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a   right-child .**
35770 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
35780 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  g to the new pag
35790 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
357a0 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70  returning, all p
357b0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
357c0 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
357d0 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68   to pages .** th
357e0 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  at the new child
357f0 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -page now contai
35800 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
35810 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a  re updated. The.
35820 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70  ** entry corresp
35830 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  onding to the ne
35840 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  w right-child po
35850 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  inter of the roo
35860 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73  t.** page is als
35870 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  o updated..**.**
35880 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
35890 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
358a0 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66  to contain a ref
358b0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68  erence to the ch
358c0 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64  ild .** page and
358d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
358e0 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
358f0 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  case the caller 
35900 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  is required.** t
35910 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
35920 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64  ge() on *ppChild
35930 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49   exactly once. I
35940 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
35950 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  s,.** an error c
35960 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
35970 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20  and *ppChild is 
35980 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
35990 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
359a0 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
359b0 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a  pRoot, MemPage *
359c0 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74  *ppChild){.  int
359d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
359e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
359f0 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
35a00 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
35a10 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
35a20 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
35a30 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
35a40 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
35a50 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
35a60 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
35a70 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
35a80 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
35a90 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
35aa0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
35ab0 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f  pRoot->pBt;    /
35ac0 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a  * The BTree */..
35ad0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
35ae0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
35af0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35b00 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
35b10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
35b20 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68  * Make pRoot, th
35b30 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
35b40 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61  he b-tree, writa
35b50 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20  ble. Allocate a 
35b60 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74  new .  ** page t
35b70 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
35b80 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68  the new right-ch
35b90 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f  ild of pPage. Co
35ba0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  py the contents.
35bb0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65    ** of the node
35bc0 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74   stored on pRoot
35bd0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68   into the new ch
35be0 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ild page..  */. 
35bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35c00 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
35c10 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
35c20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35c30 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
35c40 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26  eBtreePage(pBt,&
35c50 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c  pChild,&pgnoChil
35c60 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29  d,pRoot->pgno,0)
35c70 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f  ;.    copyNodeCo
35c80 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68  ntent(pRoot, pCh
35c90 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  ild, &rc);.    i
35ca0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
35cb0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
35cc0 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  ut(pBt, pgnoChil
35cd0 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  d, PTRMAP_BTREE,
35ce0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72   pRoot->pgno, &r
35cf0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
35d00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
35d10 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20  pChild = 0;.    
35d20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
35d30 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
35d40 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
35d50 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
35d60 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
35d70 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
35d80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
35d90 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35da0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
35db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
35dc0 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f  ild->nCell==pRoo
35dd0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54  t->nCell );..  T
35de0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
35df0 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
35e00 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e  o %d\n", pRoot->
35e10 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
35e20 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79  no));..  /* Copy
35e30 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
35e40 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74  lls from pRoot t
35e50 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65  o pChild */.  me
35e60 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
35e70 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  fl, pRoot->aOvfl
35e80 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  , pRoot->nOverfl
35e90 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d  ow*sizeof(pRoot-
35ea0 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
35eb0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
35ec0 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66   = pRoot->nOverf
35ed0 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  low;..  /* Zero 
35ee0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
35ef0 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74  pRoot. Then inst
35f00 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68  all pChild as th
35f10 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a  e right-child. *
35f20 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  /.  zeroPage(pRo
35f30 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ot, pChild->aDat
35f40 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
35f50 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
35f60 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
35f70 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
35f80 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20   pgnoChild);..  
35f90 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c  *ppChild = pChil
35fa0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
35fb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
35fc0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43  The page that pC
35fd0 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ur currently poi
35fe0 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20  nts to has just 
35ff0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e  been modified in
36000 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68  .** some way. Th
36010 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75  is function figu
36020 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20  res out if this 
36030 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61  modification mea
36040 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e  ns the.** tree n
36050 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
36060 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63  ced, and if so c
36070 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72  alls the appropr
36080 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a  iate balancing .
36090 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61  ** routine. Bala
360a0 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  ncing routines a
360b0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61  re:.**.**   bala
360c0 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20  nce_quick().**  
360d0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
360e0 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e  ).**   balance_n
360f0 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74  onroot().*/.stat
36100 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
36110 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
36120 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36130 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  E_OK;.  const in
36140 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70  t nMin = pCur->p
36150 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a  Bt->usableSize *
36160 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61   2 / 3;.  u8 aBa
36170 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
36180 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65  13];.  u8 *pFree
36190 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c   = 0;..  TESTONL
361a0 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  Y( int balance_q
361b0 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20  uick_called = 0 
361c0 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  );.  TESTONLY( i
361d0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
361e0 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a  r_called = 0 );.
361f0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
36200 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
36210 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  age;.    MemPage
36220 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
36230 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a  apPage[iPage];..
36240 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30      if( iPage==0
36250 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
36260 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
36270 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
36280 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
36290 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72  e b-tree is over
362a0 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61  full. In this ca
362b0 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20  se call the.    
362c0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64      ** balance_d
362d0 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  eeper() function
362e0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
362f0 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72   child for the r
36300 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
36310 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65   ** and copy the
36320 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
36330 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  s of the root-pa
36340 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20  ge to it. The.  
36350 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74        ** next it
36360 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
36370 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
36380 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61  nce the child pa
36390 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a  ge..        */ .
363a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
363b0 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f  (balance_deeper_
363c0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
363d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
363e0 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
363f0 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e, &pCur->apPage
36400 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
36410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ){.          pCu
36430 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20  r->iPage = 1;.  
36440 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
36450 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
36460 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
36470 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[1] = 0;.      
36480 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
36490 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76  ->apPage[1]->nOv
364a0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20  erflow );.      
364b0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
364c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
364d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
364e0 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76  e if( pPage->nOv
364f0 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61  erflow==0 && pPa
36500 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20  ge->nFree<=nMin 
36510 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
36520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36530 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74   MemPage * const
36540 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d   pParent = pCur-
36550 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d  >apPage[iPage-1]
36560 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
36570 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  t iIdx = pCur->a
36580 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a  iIdx[iPage-1];..
36590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
365a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
365b0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
365c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
365d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64  LITE_OK ){.#ifnd
365e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
365f0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20  UICKBALANCE.    
36600 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
36610 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20  asData.         
36620 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
36630 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  low==1.         
36640 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  && pPage->aOvfl[
36650 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
36660 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26  Cell.         &&
36670 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d   pParent->pgno!=
36680 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  1.         && pP
36690 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49  arent->nCell==iI
366a0 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  dx.        ){.  
366b0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20          /* Call 
366c0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
366d0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
366e0 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65  sibling of pPage
366f0 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   on which.      
36700 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20      ** to store 
36710 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
36720 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  l. balance_quick
36730 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77  () inserts a new
36740 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   cell.          
36750 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c  ** into pParent,
36760 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65   which may cause
36770 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f   pParent overflo
36780 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20  w. If this.     
36790 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
367a0 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61   the next intera
367b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
367c0 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65  oop will balance
367d0 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20   pParent .      
367e0 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65      ** use eithe
367f0 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  r balance_nonroo
36800 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64  t() or balance_d
36810 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74  eeper(). Until t
36820 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
36830 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76   happens, the ov
36840 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73  erflow cell is s
36850 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61  tored in the aBa
36860 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
36870 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  ].          ** b
36880 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20  uffer. .        
36890 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
368a0 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66  * The purpose of
368b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
368c0 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68  ssert() is to ch
368d0 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a  eck that only a.
368e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
368f0 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  gle call to bala
36900 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d  nce_quick() is m
36910 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ade for each cal
36920 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
36930 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
36940 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f   If this were no
36950 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75  t verified, a su
36960 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69  btle bug involvi
36970 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20  ng reuse.       
36980 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61     ** of the aBa
36990 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
369a0 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e  ] might sneak in
369b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
369c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
369d0 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f   (balance_quick_
369e0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
369f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
36a00 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
36a10 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61  rent, pPage, aBa
36a20 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29  lanceQuickSpace)
36a30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
36a40 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
36a50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
36a60 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c   this case, call
36a70 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
36a80 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75  () to redistribu
36a90 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  te cells.       
36aa0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50     ** between pP
36ab0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20  age and up to 2 
36ac0 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70  of its sibling p
36ad0 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c  ages. This invol
36ae0 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ves.          **
36af0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
36b00 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65  ontents of pPare
36b10 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
36b20 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20  use pParent to. 
36b30 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f           ** beco
36b40 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
36b50 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65  nderfull. The ne
36b60 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
36b70 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20  the do-loop.    
36b80 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61        ** will ba
36b90 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
36ba0 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74   page to correct
36bb0 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20   this..         
36bc0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a   ** .          *
36bd0 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20  * If the parent 
36be0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
36bf0 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66  rfull, the overf
36c00 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c  low cell or cell
36c10 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
36c20 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
36c30 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61   pSpace buffer a
36c40 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61  llocated immedia
36c50 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20  tely below. .   
36c60 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73         ** A subs
36c70 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
36c80 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
36c90 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74  will deal with t
36ca0 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20  his by.         
36cb0 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61   ** calling bala
36cc0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62  nce_nonroot() (b
36cd0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
36ce0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69  may be called fi
36cf0 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  rst,.          *
36d00 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74  * but it doesn't
36d10 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66   deal with overf
36d20 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74  low cells - just
36d30 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61   moves them to a
36d40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
36d50 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f  fferent page). O
36d60 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75  nce this subsequ
36d70 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ent call to bala
36d80 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20  nce_nonroot() . 
36d90 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
36da0 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73  completed, it is
36db0 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65   safe to release
36dc0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
36dd0 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20  er used by.     
36de0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76       ** the prev
36df0 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68  ious call, as th
36e00 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
36e10 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62  data will have b
36e20 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  een .          *
36e30 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20  * copied either 
36e40 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
36e50 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
36e60 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   or into the new
36e70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53  .          ** pS
36e80 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73  pace buffer pass
36e90 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72  ed to the latter
36ea0 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
36eb0 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20  _nonroot()..    
36ec0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
36ed0 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
36ee0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
36ef0 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67  c(pCur->pBt->pag
36f00 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
36f10 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
36f20 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20  onroot(pParent, 
36f30 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50  iIdx, pSpace, iP
36f40 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20  age==1);.       
36f50 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
36f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36f70 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e  f pFree is not N
36f80 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
36f90 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
36fa0 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20  fer used .      
36fb0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72        ** by a pr
36fc0 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62  evious call to b
36fd0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
36fe0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  . Its contents a
36ff0 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
37000 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74  * now stored eit
37010 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61  her on real data
37020 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69  base pages or wi
37030 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  thin the .      
37040 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70        ** new pSp
37050 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69  ace buffer, so i
37060 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  t may be safely 
37070 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  freed here. */. 
37080 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
37090 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
370a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
370b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
370c0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77   pSpace buffer w
370d0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74  ill be freed aft
370e0 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  er the next call
370f0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
37100 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37110 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f  (), or just befo
37120 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
37130 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65   returns, whiche
37140 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
37150 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f   comes first. */
37160 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65  .          pFree
37170 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20   = pSpace;.     
37180 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
37190 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
371a0 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20  flow = 0;..     
371b0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65   /* The next ite
371c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
371d0 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74  -loop balances t
371e0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
371f0 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
37200 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
37210 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
37220 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
37230 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37240 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20  );..  if( pFree 
37250 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
37260 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
37270 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37280 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  }.../*.** Insert
37290 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
372a0 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54  to the BTree.  T
372b0 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20  he key is given 
372c0 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a  by (pKey,nKey).*
372d0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69  * and the data i
372e0 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74  s given by (pDat
372f0 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63  a,nData).  The c
37300 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
37310 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20  ly to.** define 
37320 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72  what table the r
37330 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
37340 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20  inserted into.  
37350 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
37360 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
37370 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
37380 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ion..**.** For a
37390 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20  n INTKEY table, 
373a0 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61  only the nKey va
373b0 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69  lue of the key i
373c0 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
373d0 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
373e0 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62  r a ZERODATA tab
373f0 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e  le, the pData an
37400 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68  d nData are both
37410 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
37420 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
37430 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
37440 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
37450 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20  successful call 
37460 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61  to.** MovetoUnpa
37470 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63  cked() to seek c
37480 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70  ursor pCur to (p
37490 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61  Key, nKey) has a
374a0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
374b0 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65  erformed. seekRe
374c0 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72  sult is the sear
374d0 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  ch result return
374e0 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a  ed (a negative.*
374f0 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72  * number if pCur
37500 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e   points at an en
37510 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c  try that is smal
37520 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20  ler than (pKey, 
37530 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70  nKey), or.** a p
37540 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
37550 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
37560 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20  an etry that is 
37570 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
37580 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a  (pKey, nKey)). .
37590 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
375a0 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
375b0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
375c0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 67  hen the caller g
375d0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 2a  uarantees that.*
375e0 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  * cursor pCur is
375f0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
37600 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20 6f   existing copy o
37610 66 20 61 20 72 6f 77 20 74 68 61 74 20 69 73 20  f a row that is 
37620 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69  to be.** overwri
37630 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tten.  If the se
37640 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
37650 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75  er is 0, then cu
37660 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a 2a  rsor pCur may.**
37670 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65 6e   point to any en
37680 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74  try or to no ent
37690 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 73 6f  ry at all and so
376a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
376b0 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68  as to seek.** th
376c0 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20  e cursor before 
376d0 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20  the new key can 
376e0 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
376f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
37700 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
37710 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
37720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
37730 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
37740 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
37750 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
37760 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
37770 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
37780 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
37790 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
377a0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
377b0 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
377c0 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
377d0 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
377e0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
377f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37800 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
37810 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
37820 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
37830 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20  nt appendBias,  
37840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37850 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
37860 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
37870 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52  d */.  int seekR
37880 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
37890 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
378a0 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f 55  of prior MovetoU
378b0 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20 2a  npacked() call *
378c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
378d0 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52   int loc = seekR
378e0 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
378f0 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20 64 65  /* -1: before de
37900 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20  sired location  
37910 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20 69  +1: after */.  i
37920 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20 20  nt szNew = 0;.  
37930 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
37940 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
37950 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
37960 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
37970 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
37980 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
37990 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
379a0 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
379b0 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ll = 0;..  if( p
379c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
379d0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
379e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
379f0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
37a00 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OK );.    return
37a10 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
37a20 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
37a30 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
37a40 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
37a50 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
37a60 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
37a70 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
37a80 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65 61  ITE && !pBt->rea
37a90 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
37aa0 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
37ab0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43  eTableLock(p, pC
37ac0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
37ad0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  ur->pKeyInfo!=0,
37ae0 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73   2) );..  /* Ass
37af0 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
37b00 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ler has been con
37b10 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69 73  sistent. If this
37b20 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
37b30 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69 6e  ed.  ** expectin
37b40 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  g an index b-tre
37b50 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
37b60 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
37b70 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a  erting blob.  **
37b80 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61 73   keys with no as
37b90 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 49  sociated data. I
37ba0 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  f the cursor was
37bb0 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69 6e   opened expectin
37bc0 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79  g an.  ** intkey
37bd0 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c   table, the call
37be0 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
37bf0 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20 6b  erting integer k
37c00 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a 20  eys with a.  ** 
37c10 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61 74  blob of associat
37c20 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61  ed data.  */.  a
37c30 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30 29  ssert( (pKey==0)
37c40 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
37c50 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
37c60 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 73  f this is an ins
37c70 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ert into a table
37c80 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69 64   b-tree, invalid
37c90 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
37ca0 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f   .  ** cursors o
37cb0 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62  pen on the row b
37cc0 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28 61  eing replaced (a
37cd0 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20  ssuming this is 
37ce0 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f  a replace.  ** o
37cf0 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69 74  peration - if it
37d00 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c   is not, the fol
37d10 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f  lowing is a no-o
37d20 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  p).  */.  if( pC
37d30 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
37d40 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
37d50 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
37d60 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  (p, nKey, 0);.  
37d70 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
37d80 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
37d90 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
37da0 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
37db0 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  le..  **.  ** In
37dc0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
37dd0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f   call to btreeMo
37de0 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20  veto() below is 
37df0 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a  a no-op. For.  *
37e00 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  * example, when 
37e10 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20 69  inserting data i
37e20 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68  nto a table with
37e30 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
37e40 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79  integer.  ** key
37e50 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79 65  s, the VDBE laye
37e60 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  r invokes sqlite
37e70 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20  3BtreeLast() to 
37e80 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a  figure out the .
37e90 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79    ** integer key
37ea0 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e   to use. It then
37eb0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
37ec0 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79  tion to actually
37ed0 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a   insert the .  *
37ee0 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  * data into the 
37ef0 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49  intkey B-Tree. I
37f00 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72 65  n this case btre
37f10 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e  eMoveto() recogn
37f20 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  izes.  ** that t
37f30 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
37f40 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e 65  eady where it ne
37f50 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65  eds to be and re
37f60 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20  turns without.  
37f70 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ** doing any wor
37f80 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61  k. To avoid thwa
37f90 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69  rting these opti
37fa0 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73  mizations, it is
37fb0 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20   important.  ** 
37fc0 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65  not to clear the
37fd0 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20   cursor here..  
37fe0 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
37ff0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
38000 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
38010 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
38020 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
38030 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63 20   !loc ){.    rc 
38040 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
38050 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
38060 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
38070 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
38080 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
38090 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
380a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
380b0 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53  LID || (pCur->eS
380c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
380d0 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a  ALID && loc) );.
380e0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
380f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
38100 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
38110 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
38120 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
38130 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
38140 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
38150 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  Key );..  TRACE(
38160 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
38170 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
38180 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
38190 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
381a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
381b0 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
381c0 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
381d0 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
381e0 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
381f0 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
38200 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
38210 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
38220 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
38230 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
38240 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
38250 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
38260 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
38270 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
38280 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
38290 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
382a0 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
382b0 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
382c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
382d0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
382e0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
382f0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
38300 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
38310 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
38320 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
38330 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
38340 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
38350 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29  ;.  if( loc==0 )
38360 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
38370 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
38380 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
38390 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
383a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
383b0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
383c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
383d0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
383e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
383f0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
38400 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
38410 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
38420 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
38430 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
38440 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
38450 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
38460 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
38470 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
38480 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
38490 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64 72  oldCell);.    dr
384a0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, i